2015-02-16 3 views
0

У меня есть DataGrid, который содержит DataGridComboBoxColumn. То, что я хочу сделать, - это (dis) включить другие столбцы на основе значения этого списка. Для этого я обрабатываю событие SelectionChanged через ICommand, но эта команда никогда не вызывается. Он отлично работает для comboboxes вне DataGrid, но что такое трюк внутри DataGrid?DataGridComboBoxColumn SelectionChanged событие в MVVM

Первое примечание: значение параметра задается только тогда, когда строка больше не находится в режиме редактирования.

Второе замечание, когда клавишу ввода нажимается для завершения редактирования, параметры не установлены, даже если он был изменен с ComboBox

<DataGrid Grid.Row="0" AutoGenerateColumns="False" 
       ItemsSource="{Binding Path=AcquisitionList, Mode=TwoWay}" 
       SelectedItem="{Binding SelectedParameters}" 
       Margin="0,20,0,0" Name="dataGridAcquisitions" 
       CanUserAddRows="True" CanUserDeleteRows="True" 
       CanUserReorderColumns="False" SelectionUnit="FullRow"> 
      <DataGridComboBoxColumn Header="Choice1" Width="SizeToHeader" 
            SelectedItemBinding="{Binding Options}" 
            ItemsSource="{Binding Source={StaticResource OptionValues}}" 
            EditingElementStyle="{StaticResource StandardComboBox}" 
            ElementStyle="{StaticResource StandardComboBox}" > 
       <i:Interaction.Triggers> 
        <i:EventTrigger EventName="SelectionChanged"> 
         <i:InvokeCommandAction Command="{Binding EnableCustomParameters}"/> 
        </i:EventTrigger> 
       </i:Interaction.Triggers> 
      </DataGridComboBoxColumn> 
      <DataGridComboBoxColumn Header="Choice2" Width="SizeToHeader" 
            SelectedItemBinding="{Binding FilterType}" 
            ItemsSource="{Binding Source={StaticResource FilterTypes}}" 
            EditingElementStyle="{StaticResource StandardComboBox}" 
            ElementStyle="{StaticResource StandardComboBox}" > 
       <DataGridComboBoxColumn.CellStyle> 
        <Style TargetType="DataGridCell"> 
         <Setter Property="IsEnabled" Value="{Binding CustomParametersEnabled}"/> 
        </Style> 
       </DataGridComboBoxColumn.CellStyle> 
      </DataGridComboBoxColumn> 
</DataGrid> 

В VM

private RelayCommand enableCustomParameters; 
    private Model.AcquisitionParameters selectedParameters; 
    private ObservableCollection<Model.AcquisitionParameters> acquisitionList = new ObservableCollection<Model.AcquisitionParameters>(); 

    public ObservableCollection<Model.AcquisitionParameters> AcquisitionList 
    { 
    get { return acquisitionList; } 
    set { acquisitionList = value; OnPropertyChanged("AcquisitionList"); } 
    } 

    public Model.AcquisitionParameters SelectedParameters 
    { 
    get { return selectedParameters; } 
    set { selectedParameters = value; OnPropertyChanged("SelectedParameters"); } 
    } 

    public ICommand EnableCustomParameters 
    { 
    get 
    { 
     if(this.enableCustomParameters == null) 
     { 
      this.enableCustomParameters = new RelayCommand(
       param => this.ChangeCustomState()); 
     } 
     return this.enableCustomParameters; 
    } 
    } 

    public void ChangeCustomGainState() 
    { 
    SelectedParameters.CustomGainParametersEnabled = SelectedParameters.GainModeOptions == GainModeOptions.Custom; 
    } 

И модель

public class AcquisitionParameters : INotifyPropertyChanged 
{ 
    private Choice1 options; 
    private Choice2 filterType; 
    private bool customParametersEnabled; 

    public Choice1 Options 
    { 
    get { return options; } 
    set { options= value; OnPropertyChanged("Options"); } 
    } 

    public Choice2 FilterType 
    { 
    get { return filterType; } 
    set { filterType= value; OnPropertyChanged("FilterType"); } 
    } 

    public bool CustomParametersEnabled 
    { 
    get { return customParametersEnabled; } 
    set { customParametersEnabled = value; OnPropertyChanged("CustomParametersEnabled"); } 
    } 
} 
+0

Я думаю, что это может помочь: http://stackoverflow.com/questions/19322271/wpf-datagrid-combobox-column-how-to-manage-event-of-selection-changed BR, Daniel – dba

ответ

0

Вы должны использовать соответствующее связывание:

{Binding Path=yourCommandName, RelativeSource={RelativeSource AncestorType={x:Type DataGrid}}}

Подробнее о различных привязках от here.

+0

Спасибо за ответ, но он тоже не работает. Я пробовал это решение без успеха. Я пытался связать с DataGrid или предком UserControl, но это не удалось. У меня такая же проблема с ItemsSource Choice1 ComboBox. Для этого обходным путем было создание статического ресурса, поскольку список выбора не изменяется и является свойством элемента управления. – GuillaumeA

0

Это не решение, а обходное решение. Поскольку я не нашел способ запустить событие, когда элемент combobox был изменен, я использовал для этого свойства Options.

Сначала я должен украсить SelectedItemBinding атрибутом «UpdateSourceTrigger = PropertyChanged», в котором указывается время обновления источника привязки. From doc, PropertyChanged «Обновляет источник привязки сразу же после изменения свойства привязки привязки.« Это именно то поведение, которое я искал.

Затем модель была изменить следующим образом:

public class AcquisitionParameters : INotifyPropertyChanged 
{ 
    private Choice1 options; 
    private Choice2 filterType; 
    private bool customParametersEnabled; 

    public Choice1 Options 
    { 
    get { return options; } 
    set 
    { 
     options= value; 
     CustomParametersEnabled = options == Choice1.Options1; 
     OnPropertyChanged("Options"); 
     OnPropertyChanged("CustomParametersEnabled "); 
    } 
    } 

    public Choice2 FilterType 
    { 
    get { return filterType; } 
    set { filterType= value; OnPropertyChanged("FilterType"); } 
    } 

    public bool CustomParametersEnabled 
    { 
    get { return customParametersEnabled; } 
    set { customParametersEnabled = value; OnPropertyChanged("CustomParametersEnabled"); } 
    } 
} 

Затем, когда первый ComboBox для опции параметров имеет свой выбранный элемент изменен, то параметры свойство немедленно установить, и я обновляю также CustomParametersEnabled слишком. Это не так, как я хотел сделать с первой попытки, но это работает.