2015-05-18 180 views
0

我在xaml中定義了兩個DataGrid。第一個綁定到一個ObservableCollection。我想以某種方式將第二個DataGrid綁定到第一個DataGrid中所選對象的ObservableCollection屬性。有沒有簡單的綁定語法,或者我必須在一些選擇事件後面的代碼中做很多額外的東西?綁定到選定對象的可觀察集合列表?

回答

1

轉到MVVM方式:

  1. 把你ObservableCollectionViewModelObservableCollection<T1>其中T1是已經包含你的第二個集合類說ObservableCollection<T2>
  2. 綁定這個ObservableCollection<T1>與第一DataGridDataSource財產。
  3. 在您的ViewModel中取T1類型的屬性SelectedItem
  4. 將此屬性的ObservableCollection<T2>與第二個DataGridDataSource相關聯。
+0

權,只是數據源 - >的ItemsSource。 –

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


編輯:

如果你不想使用來自MVVMLightViewModelBase(可通過的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)); 
    } 
} 
+0

ViewModelBase是你實現的東西嗎?或者是在其他一些我沒有在標準WPF項目中引用的DLL? – user17753

+0

它是'MVVMLight'的一部分,它使得MVVM的實現變得容易得多。爲此,您可以通過在(基本)ViewModel中實現'INotifyPropertyChanged'來實現所需的功能。 –

+0

編輯我的答案,包括你將如何實現同樣的事情W/O MVVMLight。 –

相關問題