绑定到选定对象的可观察收集列表?

时间:2015-05-18 14:02:57

标签: c# wpf xaml datagrid

我在xaml中定义了两个DataGrid。第一个绑定到一个ObservableCollection。我想以某种方式将第二个DataGrid绑定到第一个ObservableCollection中所选对象的DataGrid属性。是否有简单的绑定语法,或者我是否必须在某些select事件的代码中执行大量额外的操作?

2 个答案:

答案 0 :(得分:1)

走MVVM方式:

  1. ObservableCollectionViewModelObservableCollection<T1>,其中T1是已包含第二个集合的类ObservableCollection<T2>
  2. 将此ObservableCollection<T1>DataSource的{​​{1}}属性绑定。
  3. DataGrid
  4. 中取一个T1类型的媒体资源SelectedItem
  5. 使用您的第二个ViewModel的{​​{1}}绑定此媒体资源ObservableCollection<T2>

答案 1 :(得分:1)

@Nitin Joshi是绝对正确的。要将这些“项目符号”放在代码格式中,您最终可能会得到类似......

的内容

查看

<Window.DataContext>
    <viewModel:MainViewModel />
</Window.DataContext>

<StackPanel>
    <DataGrid ItemsSource="{Binding Items}" 
              SelectedItem="{Binding SelectedItem}" 
              AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Column" Binding="{Binding}" />
        </DataGrid.Columns>
    </DataGrid>
    <DataGrid ItemsSource="{Binding SelectedItem}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Header="Column" Binding="{Binding}" />
        </DataGrid.Columns>
    </DataGrid>
</StackPanel>

<强>视图模型

public class MainViewModel : ViewModelBase
{
    private ObservableCollection<string> _items;
    private string _selectedItem;

    public MainViewModel()
    {
        Items = new ObservableCollection<string>(new[] { "a", "b", "c" });
    }

    public ObservableCollection<string> Items
    {
        get { return _items; }
        set { _items = value; RaisePropertyChanged(); }
    }

    public string SelectedItem
    {
        get { return _selectedItem; }
        set { _selectedItem = value; RaisePropertyChanged(); }
    }
}

<强>输出

imgur

修改

如果您不想使用ViewModelBase中的MVVMLight(可通过NuGet获得),您可以实现自己实现INotifyPropertyChanged界面的相同功能。然后上面会变成:

public class MainViewModel : BaseViewModel
{
    // Same code as above, notice different base class
}

BaseViewModel

的位置
public abstract class BaseViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null)
    {
        var handler = PropertyChanged;
        if (handler != null) 
            handler(this, new PropertyChangedEventArgs(propertyName));
    }
}