Как установить событие для выбора измененного списка данных? - PullRequest
0 голосов
/ 29 мая 2018

Привет У меня есть проект wpf, который привязывает сетку данных к модулю следующим образом:

<DataGrid.Columns>
    <DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True"/>
        <DataGridTemplateColumn Header="Values">
           <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                <ComboBox ItemsSource="{Binding Values}" SelectedItem="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
              </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

Это работает отлично.Теперь я хочу добавить некоторые функции, включая настройку события в выпадающем списке SelectionChanged.Таким образом, я изменил файл xaml следующим образом:

<DataGrid.Columns>
    <DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True"/>
        <DataGridTemplateColumn Header="Values">
           <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                <ComboBox ItemsSource="{Binding Values}" SelectedItem="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
                    /!-- Add an EventSetter here. -->
                    <Style TargetType="{x:Type ComboBox}">                                                                                           
                         <EventSetter Event="SelectionChanged" Handler="ValueChanged" />                                                                                  
                    </Style>
                </ComboBox>
              </DataTemplate>
           </DataGridTemplateColumn.CellTemplate>
    </DataGridTemplateColumn>
</DataGrid.Columns>

И добавил функцию в бэкэнд, например:

    private void ValueChanged(object sender, SelectionChangedEventArgs e)
    {
         var comboBox = sender as ComboBox;
         if (comboBox.SelectedItem != null)
         {
              //do something here.
         }
    }

Но это приводит к разбивке проекта с помощью error: "The Application is in break mode."когда я изменил ячейку со списком.Так в чем может быть проблема?Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Вам необходимо установить свойство Style ComboBox для вашего Style:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <ComboBox ItemsSource="{Binding Values}" SelectedItem="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
            <ComboBox.Style>
                <Style TargetType="{x:Type ComboBox}">
                    <EventSetter Event="SelectionChanged" Handler="ValueChanged" />
                </Style>
            </ComboBox.Style>
        </ComboBox>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

Или вы можете подключить обработчик событий непосредственно к элементу ComboBox и избавиться от него.из Style:

<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <ComboBox ItemsSource="{Binding Values}" SelectedItem="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                  SelectionChanged="ValueChanged" />
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>
0 голосов
/ 29 мая 2018

Глупый, как я.Просто установив событие внутри combobox, устраните проблему.

<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True"/>
    <DataGridTemplateColumn Header="Values">
       <DataGridTemplateColumn.CellTemplate>
          <DataTemplate>
            <ComboBox ItemsSource="{Binding Values}" SelectedItem="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
                     SelectionChanged="ValueChanged" />
          </DataTemplate>
       </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

...