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

时间:2015-03-24 17:43:58

标签: c# wpf mvvm user-controls mvvm-light

我有一个WPF / MVVMLight应用程序。我的主视图/ viewmodel在viewmodel中有一个代码隐藏的数据网格。我最近决定自己喜欢 第二个视图中的这个数据网格,一个视图是实时数据,一个视图显示相同数据的历史。我不想在两个地方复制此代码,因此我决定使用viewmodel创建一个usercontrol,并将相应的datagrid /代码移动到usercontrol。

以下是问题/问题:我想将usercontrol-> datagrid-> itemsource设置为主viewmodel中的属性。我已经看到一些人们创建依赖属性的例子,但是我不知道如何处理这个因为我不能在我的viewmodel中继承DependencyObject,因为它已经继承了ViewModelBase(来自mvvm light),所以我不能使用GetValue / SetValue如下所示。我对此很新,所以我可能会遗漏一些非常明显的东西。在寻找我的问题的解决方案时,我发现MVVM Light有一些消息传递功能,这是一种更好的方法吗?有没有比我正在采取的更好的方法?感谢您提供任何指导。

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

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); }
    }

---试图更加明确我希望实现的目标..

下面是我的usercontrol中的datagrid示例。我的用户控件有一个代码隐藏的VM,其中包含您在下面看到的绑定的属性以及与上下文菜单相关的一些其他代码。

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

所以在我的主视图中,我添加了用户控件,我想做这样的事情:

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

2 个答案:

答案 0 :(得分:1)

同样的问题已解决here。 (注意:不使用依赖项属性)使用EventHandler和使用MVVM Light Messaging处理此示例的示例。线程中的其他可能的解决方案/答案。

答案 1 :(得分:0)

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

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

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

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