尝试从DropDownClosed事件处理程序

时间:2017-01-30 21:12:26

标签: wpf combobox datagrid wpfdatagrid datatemplate

我之前有一个ListView,它显示了一个“Player”对象属性的ObservableCollection,我试图将其转换为DataGrid。我有大部分工作,但目前在一个特定属性(状态)上看到更改有一些问题,由ComboBox表示。我们的想法是允许玩家覆盖一组表示“活着,死亡,中毒”等内容的枚举之间的“状态”值。我已经连接了一个EventHandler,当ComboBox关闭时,在该处理程序内,尝试将Player对象作为播放器抓取,这样我就可以发出有效的播放器值。

这是XAML的一个片段,我正在通过DataTemplate创建ComboBox。

<DataGridTemplateColumn Header="Status">
    <DataGridTemplateColumn.CellEditingTemplate>
        <DataTemplate>
            <ComboBox Name="cbStatus" 
                      ItemsSource={Binding Source={StaticResource statusTypes}}" 
                      SelecteItem="{Binding statusType, Mode=TwoWay}" 
                      DropDownClosed="cbStatusType_DropDownClosed"/>
        </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>

在事件处理程序中,我使用以下内容尝试根据从GUI的特定行返回的值来获取“Player”对象。

Player playerOverridden = (Player)(sender as FrameworkElement).DataContext;

但是,当我在ComboBox关闭并且选择了新值时调试新的playerOverridden时,我没有看到在playerOverridden中捕获该值。

这几乎就是我在使用GridViewColumn.CellTemplates的ListView中所做的,它工作得很好。不确定为什么Status值会像最初设置的那样返回,而不是玩家从ComboBox中选择的值。

1 个答案:

答案 0 :(得分:0)

必须将UpdateSourceTrigger上的SelectedItemBinding设置为PropertyChanged,它才有效。不知道为什么必须在DataGrid中明确设置它,而不是我需要在ListView中做的事情。

SelectedItem={"Binding statusType, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"