2016-12-27 57 views
1

这是一个示例代码:如何更改DataGrid ItemsSource更改属性时?

public class GridViewWindowViewModel : INotifyPropertyChanged 
    { 
     public GridViewWindowViewModel() 
     { 
      Tables = new ObservableCollection<string> { "Person", "Car" }; 
      SainaAccessEntity = new SainaAccessEntity { TableName = "Person" }; 
     } 

     private SainaAccessEntity _SainaAccessEntity; 

     public SainaAccessEntity SainaAccessEntity 
     { 
      get { return _SainaAccessEntity; } 
      set 
      { 
       if (_SainaAccessEntity != value) 
       { 
        _SainaAccessEntity = value; 
        OnPropertyChanged(); 
       } 
      } 
     } 

     private ObservableCollection<string> _Tables; 

     public ObservableCollection<string> Tables 
     { 
      get { return _Tables; } 
      set 
      { 
       if (_Tables != value) 
       { 
        _Tables = value; 
        OnPropertyChanged(); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
     private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

    } 

这是模型类:

public class SainaAccessEntity : INotifyPropertyChanged 
    { 
     private string _TableName; 

     public string TableName 
     { 
      get { return _TableName; } 
      set 
      { 
       if (value != _TableName) 
       { 
        _TableName = value; 
        OnPropertyChanged(); 
       } 
      } 
     } 

     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
     private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

自定义数据网格视图:

public class MyDataGrid : DataGrid 
{ 
    public MyDataGrid() 
    { 
     var x = new ObservableCollection<Person> { new Person { Name = "Ali", Family = "Jalilvand" } }; 
    } 
    public SainaAccessEntity SainaAccessEntity 
    { 
     get { return (SainaAccessEntity)GetValue(SainaAccessEntityProperty); } 
     set { SetValue(SainaAccessEntityProperty, value); } 
    } 
    public static readonly DependencyProperty SainaAccessEntityProperty = 
     DependencyProperty.Register("SainaAccessEntity", typeof(SainaAccessEntity), typeof(MyDataGrid), new PropertyMetadata(null, SainaAccessEntity_Changed)); 

    private static void SainaAccessEntity_Changed(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var u = d as MyDataGrid; 
     if (u.SainaAccessEntity.TableName == "Person") 
     { 
      u.ItemsSource = new ObservableCollection<Person> { new Person { Name = "Ali", Family = "Bayat" } }; 
     } 
     else 
     { 
      u.ItemsSource = new ObservableCollection<Car1> { new Car1 { Name = "BMW", Model = "518",Color="Red" } }; 
     } 

    } 

} 

汽车和人物型号:

public class Car1 
{ 
    public string Model { get; set; } 
    public string Name { get; set; } 
    public string Color { get; set; } 

} 

public class Person 
{ 
    public string Name { get; set; } 
    public string Family { get; set; } 
} 

主窗口XAML:

<Window x:Class="TestWpfApplication.GridViewWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:local="clr-namespace:TestWpfApplication" 
     mc:Ignorable="d" 
     Title="GridViewWindow" Height="300" Width="300"> 
    <Window.Resources> 
     <local:GridViewWindowViewModel x:Key="Vm"/> 
    </Window.Resources> 
    <Grid DataContext="{StaticResource Vm}"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="*"/> 
      <RowDefinition Height="auto"/> 
     </Grid.RowDefinitions> 
     <local:MyDataGrid VerticalAlignment="Top" SainaAccessEntity="{Binding SainaAccessEntity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <ComboBox Margin="0,5.694,0,0" Grid.Row="1" ItemsSource="{Binding Tables, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedItem="{Binding SainaAccessEntity.TableName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"></ComboBox> 
    </Grid> 
</Window> 

如何在更改DataGrid ItemsSource时更改属性?我有自定义DataGrid在WPF中,它有一个属性,定义表名称,我想动态更改ItamsSource,当更改此属性...

回答

2

自定义DataGrid的SainaAccessEntity属性绑定到视图模型的SainaAccessEntity财产,但你从来没有设置该属性时在ComboBox变化的选择。

视图模型的Tables属性应返回一个ObservableCollection <SainaAccessEntity>,而不是一个ObservableCollection的<串>:

public class GridViewWindowViewModel : INotifyPropertyChanged 
{ 
    public GridViewWindowViewModel() 
    { 
     Tables = new ObservableCollection<SainaAccessEntity> 
      { 
       new SainaAccessEntity { TableName = "Person" }, 
       new SainaAccessEntity { TableName = "Car" }, 
      }; 
     SainaAccessEntity = Tables[0]; 
    } 

    private SainaAccessEntity _SainaAccessEntity; 

    public SainaAccessEntity SainaAccessEntity 
    { 
     get { return _SainaAccessEntity; } 
     set 
     { 
      if (_SainaAccessEntity != value) 
      { 
       _SainaAccessEntity = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 

    private ObservableCollection<SainaAccessEntity> _Tables; 
    public ObservableCollection<SainaAccessEntity> Tables 
    { 
     get { return _Tables; } 
     set 
     { 
      if (_Tables != value) 
      { 
       _Tables = value; 
       OnPropertyChanged(); 
      } 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged = delegate { }; 
    private void OnPropertyChanged([CallerMemberName] string propertyName = null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
} 

您应该然后ComboBox的SelectedItem属性绑定到视图的SainaAccessEntity财产模型并将组合框的DisplayMemberPath属性设置为“TableName”:

<ComboBox Margin="0,5.694,0,0" Grid.Row="1" ItemsSource="{Binding Tables, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
        SelectedItem="{Binding SainaAccessEntity, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
        DisplayMemberPath="TableName"></ComboBox> 

用这些cha如果在ComboBox中选择一个项目,DataGrid的ItemsSource应该按预期进行更改。

1

在这里您的属性'SainaAccessEntity'不更改,只有TableName正在更改。为此,您可以尝试下面的代码,或者您可以将“SainaAccessEntity”中的类型更改为字符串。

变化“SainaAccessEntity_Changed”方法的代码

 var u = d as MyDataGrid; 

     if (u.SainaAccessEntity == null) 
     { 
      return; 
     } 

     // intial set value 
     if (u.SainaAccessEntity.TableName == "Person") 
     { 
      u.ItemsSource = new ObservableCollection<Person> { new Person { Name = "Ali", Family = "Bayat" } }; 
     } 
     else 
     { 
      u.ItemsSource = new ObservableCollection<Car1> { new Car1 { Name = "BMW", Model = "518", Color = "Red" } }; 
     } 

     // set value on change 
     var _notify = u.SainaAccessEntity as INotifyPropertyChanged; 
     if (_notify != null) 
     { 
      _notify.PropertyChanged += (sender, ev) => 
      { 
       if (u.SainaAccessEntity.TableName == "Person") 
       { 
        u.ItemsSource = new ObservableCollection<Person> { new Person { Name = "Ali", Family = "Bayat" } }; 
       } 
       else 
       { 
        u.ItemsSource = new ObservableCollection<Car1> { new Car1 { Name = "BMW", Model = "518", Color = "Red" } }; 
       } 
      }; 
     }