2017-05-25 41 views
0

我有一個ListBox和DataGrid。如何根據列表框選擇更新DataGrid的ItemsSource

我想在更改ListBox中的選擇時更改DataGrid的ItemsSource。 示例:如果我選擇ListBox中的第一個項目,Collection1應綁定到DataGrid的ItemsSource。如果我選擇第二個項目Collection2應綁定到DataGrid的ItemsSource。

下面是我試過

視圖 - XAML中

<ListBox 
    Grid.Column="0" 
    Width="100" 
    ItemsSource="{Binding coll1}" 
    SelectedItem="{Binding SelectedName}"> 
</ListBox> 
<DataGrid 
    Grid.Column="1" 
    ItemsSource="{Binding coll, Mode=TwoWay}"> 
</DataGrid>` 

視圖模型 -

public class VM1 
    { 
     private List<Employee> _coll = new List<Employee>(); 
     public List<Employee> coll 
     { 
      get 
      { 
       return _coll; 
      } 
      set 
      { 
       coll = value; 
      } 
     } 

     public List<string> _coll1 = new List<string>(); 

     public List<string> coll1 
     { 
      get 
      { 
       return _coll1; 
      } 
     } 

     private string _selectedName = ""; 
     public string SelectedName 
     { 
      get 
      { 
       return _selectedName; 
      } 
      set 
      { 
       _selectedName = value; 
      } 
     } 

     public VM1() 
     { 
      _coll.Add(new Employee()); 
      _coll.Add(new Employee()); 
      _coll.Add(new Employee()); 

      _coll1.Add("One"); 
      _coll1.Add("Two"); 
      _coll1.Add("Three"); 
     } 

    } 

型號 -

public class Employee 
    { 
     public Employee() 
     { 
      Name = "Hello"; 
     } 

     public string Name { get; set; } 
    } 
+0

查找INotifyPropertyChanged的作爲用於綁定更新通知的根。 –

+1

什麼是'Collection1'和'Collection2'? –

回答

0

您需要綁定的DataGrid的ItemsSource到喲的財產你的視圖模型將根據SelectedName進行更改。事情是這樣的:

public class VM1 : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private IEnumerable _collection; 
    private string _selectedName; 

    public IEnumerable Collection 
    { 
     get { return _collection; } 
     set 
     { 
      _collection = value; 
      PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(nameof(Collection))); 
     } 
    } 

    public string SelectedName 
    { 
     get { return _selectedName; } 
     set 
     { 
      _selectedName = value; 

      // Set Collection property based on the _selectedName 
      if (_selectedName == "A") 
       Collection = new[] { 1, 2, 3 }; // Collection 1 
      else if (_selectedName == "B") 
       Collection = new[] { 4, 5, 6 }; // Collection 2 
     } 
    } 
} 

然後,只需綁定DataGrid添加到收藏:

ItemsSource="{Binding Path=Collection, Mode=OneWay}" 
0

你可以像這樣做,這是設置你正確的軌道:

XAML

<Window.DataContext> 
    <local:MainViewModel /> 
</Window.DataContext> 
<StackPanel> 
    <ListBox x:Name="lstOfCollections" 
      Width="100" 
      DisplayMemberPath="Name" 
      ItemsSource="{Binding Collection}"> 
    </ListBox> 
    <DataGrid DisplayMemberPath="Name" 
       ItemsSource="{Binding ElementName=lstOfCollections,Path=SelectedItem}"> 
    </DataGrid> 
</StackPanel> 

這是MainViewModel用於fo r dataContext

public class MainViewModel 
{ 
    public MainViewModel() 
    { 
     //Initializing collections 
     Coll1 = new ObservableCollection<Employee> { 
      new Employee { Name = "Coll1" }, 
      new Employee { Name = "Coll1" }, 
      new Employee { Name = "Coll1" }, 
     }; 
     Coll2 = new ObservableCollection<Employee> { 
      new Employee { Name = "Coll2" }, 
      new Employee { Name = "Coll2" }, 
      new Employee { Name = "Coll2" }, 
     }; 
     Coll3 = new ObservableCollection<Employee> { 
      new Employee { Name = "Coll3" }, 
      new Employee { Name = "Coll3" }, 
      new Employee { Name = "Coll3" }, 
     }; 

     Collection.Add(Coll1); 
     Collection.Add(Coll2); 
     Collection.Add(Coll3); 
    } 
    //collection1 
    public ObservableCollection<Employee> Coll1 { get; set; } 
    //collection2 
    public ObservableCollection<Employee> Coll2 { get; set; } 
    //collection3 
    public ObservableCollection<Employee> Coll3 { get; set; } 

    public ObservableCollection<object> Collection { get; set; } = new ObservableCollection<object>(); 
} 

以及用於使用一些數據填充這些集合的Employee類。

public class Employee 
{ 
    public string Name { get; set; } 
} 

[coll1 selectedcoll2 selectedcoll3 selected