将ObservableCollection公开为DependencyProperty

时间:2015-01-27 16:53:10

标签: c# wpf mvvm datagrid

我已经看到了其他问题:

ObservableCollection dependency property does not update when item in collection is deleted

MVVM binding to a User Control with an ObservableCollection dependency property

......甚至......

https://go4answers.webhost4life.com/Example/databinding-observable-collection-196835.aspx

但是他们要么做我不做的事情,要么就是我没得到它。

  • 我正在使用MVVM。
  • 我在一个包含会员列表的视图上有一个DataGrid。
  • 当用户右键单击DataGrid时,我有一个打开的RelayCommands菜单(从ViewModel绑定)。
  • 如果用户选择多个成员,我希望MergeMember.CanExecute返回true。
  • 由于我无法绑定到SelectedItems集合,因此我在选择更改时填充的视图中有一个DependencyProperty。

我的问题是DependencyProperty在属性本身发生更改时触发更改(即ObservableCollection获取" newed")但是当集合中的项目发生更改时不会触发更改。

我已经看到的其他解决方案在View中发现了变化,我试图通知ViewModel这一变化。

如何通知ViewModel DependencyProperty集合的更改?

如果您觉得有必要,我可以发布代码示例,但是我所尝试的所有内容都是一团糟。

1 个答案:

答案 0 :(得分:1)

通常情况下,您正在描述我使用此解决方案。 为了知道DataGrid中选择了哪些项目(在MVVM应用程序中),您不需要将ObservableCollection公开为DependencyProperty。

DataGridRow模型中添加属性:

public bool IsSelected
{
    get
    {
        return isSelected;
    }
    set
    {
        if (isSelected != value)
        {
            isSelected = value;
            OnPropertyChanged("IsSelected"); // if you are implementing INotifyPropertyChanged
        }
    }
}

关于XAML,您可以在DataGrid中使用Style来绑定IsSelected属性:

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=People}">
    <DataGrid.Columns>
        <!-- your columns are here -->
    </DataGrid.Columns>

    <DataGrid.ItemContainerStyle>
        <Style TargetType="DataGridRow">
            <Setter Property="IsSelected" Value="{Binding Path=IsSelected}" />
        </Style>
    </DataGrid.ItemContainerStyle>
</DataGrid>

通过这种方式,在ViewModel中,您始终可以在不订阅事件的情况下了解选择了哪些项目,并且可以在MergeMember RelayCommand的CanExecute方法中编写逻辑。