我对 MVVM 和 c# 系统相当陌生,只是将其用作一个小小的业余爱好。在过去的三天里,我一直在为以下问题感到绝望。
我有一个带有相应视图模型的自定义控件视图。该控件在基于 observableCollection 的项目控件中显示多次。现在,我在自定义控件视图模型中创建了一个 dependencyProperty,但在 DataTemplate 内的 XAML 中,该属性未被识别。
显示项控件的XAML(SignalGroups是observableCollection
<ItemsControl Grid.Row="1"
ItemsSource="{Binding SignalGroups}">
<ItemsControl.ItemsPanel >
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<view:SignalCycleView currentSignalGroup="{Binding }" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
SignalCycleViewModle 的 c# 以及 dependencyProperty 的定义
public static readonly DependencyProperty SignalGroupProperty =
DependencyProperty.Register("currentSignalGroup",
typeof(SignalGroup),
typeof(SignalCycleView),
new FrameworkPropertyMetadata(default(SignalGroup), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public SignalGroup SignalGroup
{
get => (SignalGroup)GetValue(SignalGroupProperty);
set => SetValue(SignalGroupProperty, value);
}
SignalCycleView 的视图和视图模型之间的 XAML 连接
<UserControl.DataContext>
<viewmodel:SignalCycleViewModel />
</UserControl.DataContext>
DataTemplate 中的属性 currentSignalGroup 未被识别。 也许有人可以暗示我的错误在哪里。
将 dependencyProperty 绑定到 dataTemplate
currentSignalGroup
无法识别,因为 DP 被称为 SignalGroup
。 DP 声明应遵循精确的模式,并且所有名称应匹配。创建新 DP 的最快方法是使用 Visual Studio 代码片段:在 VS 中快速创建依赖属性
您的 DP 声明应为:
public static readonly DependencyProperty CurrentSignalGroupProperty =
DependencyProperty.Register(nameof(CurrentSignalGroup),
typeof(SignalGroup),
typeof(SignalCycleView),
new FrameworkPropertyMetadata(default(SignalGroup), FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));
public SignalGroup CurrentSignalGroup
{
get => (SignalGroup)GetValue(CurrentSignalGroupProperty);
set => SetValue(CurrentSignalGroupProperty, value);
}
它应该在 SignalCycleView 类中
好的。通过这些更改,我可以访问 XAML 中的属性。我从 SignalCycleView 中删除了数据上下文,我可以构建应用程序。但DP始终为空?
我相信问题出在某处
<ItemsControl Grid.Row="1"
ItemsSource="{Binding SignalGroups}">
<ItemsControl.ItemsPanel >
<ItemsPanelTemplate>
<StackPanel Orientation="Vertical"></StackPanel>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<view:SignalCycleView currentSignalGroup="{Binding }" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>