2016-08-18 5 views
0

Я хочу связать свой DataGridComboBoxColumn на ObservableCollection<string> Values. Для этого я написал этот .xaml код:DataGrid DataGridComboBoxColumn ItemsSource Binding не работает

<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding FilterMng.FilterCollection}" CanUserAddRows="False" SelectionChanged="ComboBox_SelectionChanged"> 
    <DataGrid.Columns> 
     <DataGridComboBoxColumn Header="Wert" Width="*" SelectedValueBinding="{Binding SelectedValue, UpdateSourceTrigger=PropertyChanged}"> 
      <DataGridComboBoxColumn.ElementStyle> 
       <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}"> 
        <Setter Property="ItemsSource" Value="{Binding Values}"/> 
       </Style> 
      </DataGridComboBoxColumn.ElementStyle> 
      <DataGridComboBoxColumn.EditingElementStyle> 
       <Style TargetType="{x:Type ComboBox}" BasedOn="{StaticResource {x:Type ComboBox}}"> 
        <Setter Property="ItemsSource" Value="{Binding Values}"/> 
       </Style> 
      </DataGridComboBoxColumn.EditingElementStyle> 
     </DataGridComboBoxColumn> 
    </DataGrid.Columns> 
</DataGrid> 

FilterMng.cs является менеджером класс Filter.cs. Он содержит ObservableCollection<Filter> FilterCollection{get;set;} и некоторые методы, такие как public void CreateFilter(){}. Но эти методы работают. Когда я выполняю метод CreateFilter();, DataGrid показывает еще одну запись.

Мой Filter.cs код:

public class Filter : INotifyPropertyChanged 
{ 
    #region Properties 

    ObservableCollection<string> Values { get; set; } 

    private string _selectedProperty; 
    public string SelectedProperty 
    { 
     get { return this._selectedProperty; } 
     set { this._selectedProperty = value; this.OnPropertyChanged("SelectedProperty"); } 
    } 

    private string _selectedValue; 
    public string SelectedValue 
    { 
     get { return this._selectedValue; } 
     set { this._selectedValue = value; this.OnPropertyChanged("SelectedValue"); } 
    } 

    #endregion Properties 

    #region c'tor 

    public Filter() 
    { 
     if (this.Values == null) 
      this.Values = new ObservableCollection<string>(); 

     Values.Add("Entry1"); 
    } 

    #endregion c'tor 

    #region OnPropertyChanged 

    public event PropertyChangedEventHandler PropertyChanged; 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = PropertyChanged; 
     if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
    } 

    #endregion OnPropertyChanged 
} 

Я могу связать все propertys кроме Values.

Теперь я использовал Snoop для проверки наличия ItemsSource ошибок. Существует ошибка:

System.Windows.Data Error: 40 : BindingExpression path error: 'Values' property not found on 'object' ''Filter' (HashCode=31703865)'. BindingExpression:Path=Values; DataItem='Filter' (HashCode=31703865); target element is 'TextBlockComboBox' (Name=''); target property is 'ItemsSource' (type 'IEnumerable') 

У вас есть идеи?

ответ

1
ObservableCollection<string> Values { get; set; } 

В этом сеттер собственности, вы не уведомляя какое свойство изменяется

Попробуйте что-то вроде этого

private ObservableCollection<string> values; 
public ObservableCollection<string> Values { get { return values; } set {values = value; this.OnPropertyChanged("Values ");} } 

Я уверен, что это проблема с кодом

+0

редактировал ответить –

+0

Спасибо большое! Теперь это работает. – MyNewName

Смежные вопросы