【问题标题】:How to set event for selectionchanged of datagrid combobox?如何为数据网格组合框的 selectionchanged 设置事件?
【发布时间】:2018-05-29 08:45:00
【问题描述】:

您好,我有一个 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."。那么可能是什么问题?提前致谢!

【问题讨论】:

    标签: wpf combobox datagrid eventsetter


    【解决方案1】:

    像我一样愚蠢。只需在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>
    

    【讨论】:

      【解决方案2】:

      您需要将ComboBoxStyle 属性设置为您的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>
      

      【讨论】:

        猜你喜欢
        • 2012-10-13
        • 1970-01-01
        • 1970-01-01
        • 2014-09-14
        • 2011-06-05
        • 1970-01-01
        • 2013-04-03
        • 1970-01-01
        • 2011-05-15
        相关资源
        最近更新 更多