繁体   English   中英

在WPF / MVVMLight应用程序中创建依赖项属性的指南

[英]Guidance in creating a dependency property in WPF/MVVMLight application

我有一个WPF / MVVMLight应用程序。 我的主视图/视图模型有一个数据网格,该视图后面有代码。 我最近决定在第二个视图中使用该数据网格,一个视图是实时数据,一个视图显示相同数据的历史记录。 我不想在两个地方重复此代码,因此我决定创建一个带有ViewModel的用户控件,并将适当的数据网格/代码移至该用户控件。

这是问题/问题:我想将usercontrol-> datagrid-> itemsource设置为主视图模型中的一个属性。 我已经看到了一些人们在其中创建依赖属性的示例,但是我不确定如何处理它,因为我不能在我的视图模型中继承DependencyObject,因为它已经继承了ViewModelBase(从mvvm light继承),所以我不能使用GetValue / SetValue如下所示。 我对此很陌生,所以我可能会错过一些非常明显的东西。 在寻找解决方案时,我发现MVVM Light具有某些消息传递功能,这是否是解决此问题的更好方法? 有没有比我正在采取的更好的方法了? 感谢您的指导。

该示例未从我的代码中提取,仅用于显示由于无法继承DependencyObject而无法弄清楚如何使用的GetValue / SetValue。

public class MyViewModel : ViewModelBase
{

    public static DependencyProperty MyProperty =
        DependencyProperty.Register("GridItemSource", typeof(EventData), typeof(MyViewModel),
        new FrameworkPropertyMetadata() { BindsTwoWayByDefault = true });

    public EventData GridItemSource
    {
        get { return (EventData)GetValue(MyProperty); }
        set { SetValue(MyProperty, value); }
    }

---试图更清楚我希望实现的目标。

下面是我的用户控件中的数据网格的示例。 我的用户控件具有一个VM,该VM的代码后面带有您在下面看到的绑定的属性以及一些与上下文菜单有关的其他代码。

我要解决的问题是现在如何设置usercontrol datagrid项源,因为它位于嵌套在我的主视图中的usercontrol中,并且最终将嵌套在另一个视图中。 我的主视图有一个ObservableCollection,其中包含我想要将usercontrol / datagrid / itemsource设置为的数据。 我的想法是我可以在用户控件中创建一个依赖项属性,我的主视图可以用来设置源。

因此,在添加用户控件的主视图中,我想执行以下操作:

<Views:MyUserControl SomePropertyInUserControl="{Binding MyObservableCollection, Mode=TwoWay}"/>

在我的用户控件视图中:

<DataGrid Grid.Row="0" SelectedItem="{Binding DataGridSelectedItem, Mode=TwoWay}" HeadersVisibility="All" HorizontalAlignment="Stretch" Name="lbMain" ItemsSource="{Binding MonitorEventItems, Mode=TwoWay}" AutoGenerateColumns="False" SelectionMode="Single" >
    <DataGrid.ContextMenu>
        <ContextMenu ItemsSource="{Binding ContextMenuEventList,Mode=Default}"/>
    </DataGrid.ContextMenu>
    <DataGrid.Columns>
        <DataGridTextColumn Header="Date" Binding="{Binding EventDateTime}" Width="Auto"/>
        <DataGridTextColumn Header="Event Type" Binding="{Binding EventType}" Width="Auto"/>
        <DataGridTextColumn Header="Folder/File" Binding="{Binding FFType}" Width="Auto"/>
        <DataGridTextColumn Header="Name" Binding="{Binding EventFileFolderName}" Width="Auto"/>
        <DataGridTextColumn Header="Full Path" Binding="{Binding EventFileFolderFullPath}" Width="*"/>
    </DataGrid.Columns>
</DataGrid>

同样的问题在这里解决。 (注意:不使用依赖项属性)使用EventHandler和MVVM Light Messaging处理该示例。 还有其他可能的解决方案/答案。

不要在视图模型中使用依赖项属性。 它们与普通属性的主要区别在于可以通过视图模型中不需要的绑定,样式,动画等进行设置。

而是,创建一个引发INotifyPropertyChanged接口的PropertyChanged事件的属性,该事件由ViewModelBase类实现。 另外,使用ObservableCollection作为属性类型,以通知Items集合中的更改。

public class MyViewModel : ViewModelBase
{
    private ObservableCollection<DataItem> items;

    public ObservableCollection<DataItem> Items
    {
        get { return items; }
        set
        {
            items = value;
            RaisePropertyChanged("Items");
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM