MVVM、XAML、C# - DependencyProperty - ItemsControl 中的 ObservableCollection 无法识别 Property

问题描述 投票:0回答:2

我对 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

c# wpf xaml mvvm dependency-properties
2个回答
0
投票

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 类中


0
投票

好的。通过这些更改,我可以访问 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>
© www.soinside.com 2019 - 2024. All rights reserved.