【问题标题】:Why is my DataGridComboBoxColumn clearing its value when I navigate away from it?当我离开它时,为什么我的 DataGridComboBoxColumn 会清除它的值?
【发布时间】:2013-01-08 08:56:45
【问题描述】:

我有一个包含两列的 DataGrid:

  1. DataGridComboBoxColumn
  2. DataGridTextColumn。

我已经设置了数据验证,这样如果一个有值,另一个就会出错,直到它也有一个值。验证很愚蠢,但它提供了一些用于验证的简单标准,因此我可以说明这个问题。

当我在文本单元格中输入内容时,按 Tab,然后单击第一个单元格,第一个单元格显示它处于错误状态(这是正确的)。问题是,当我从组合框下拉列表中选择某些内容并离开该单元格(通过按 Tab 或单击另一个单元格)时,我为组合框选择的值会消失。每当属性更改时,我都会设置绑定来更新我的源,因此只要我选择它,它就会设置为我选择的值。但是,当我离开单元格时,该属性被设置为 null。如果单元格未处于错误状态,我看不到此行为。

有人可以帮忙吗?这是我的 DataGrid 的 XAML:

        <DataGrid Grid.Row="2"
              Name="GrdData"
              ItemsSource="{Binding Path=Dvm.Data}"
              SelectedItem="{Binding Path=Dvm.SelectedData, Mode=TwoWay}"
              CanUserAddRows="True"
              CanUserDeleteRows="False"
              AutoGenerateColumns="False"
              Margin="5"
              SelectionMode="Single"
              IsEnabled="{Binding Path=IsGridEnabled}">
        <DataGrid.Columns>
            <DataGridComboBoxColumn Header="Column 1"
                                    SelectedItemBinding="{Binding Path=Col1, Mode=TwoWay, ValidatesOnDataErrors=True, UpdateSourceTrigger=PropertyChanged}"
                                    Width="*"
                                    DisplayMemberPath="Description">
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=DropDownValues, Mode=OneWay}" />
                        <Setter Property="IsSynchronizedWithCurrentItem" Value="False"/>
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox">
                        <Setter Property="ItemsSource" Value="{Binding Path=DropDownValues, Mode=OneWay}"/>
                        <Setter Property="IsDropDownOpen" Value="True" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>
            <DataGridTextColumn Header="Column 2"
                                Binding="{Binding Path=Col2, Mode=TwoWay, ValidatesOnDataErrors=True}"
                                Width="*"/>
        </DataGrid.Columns>
    </DataGrid>

我无法想象我做错了什么。我看到了这个other link,它似乎描述了我遇到的同样的问题,但对他们有用的解决方案似乎对我不起作用;我添加了 SelectedValueBinding 和 SelectedValuePath,但行为没有改变。

【问题讨论】:

    标签: wpf data-binding validation datagridcomboboxcolumn


    【解决方案1】:

    从绑定中删除Mode=TwoWay

    问题是由剪贴板和自动化支持中的错误引起的。这可以通过将单元格上的特殊属性设置为 ClipboardContentBinding 然后读取该值来实现。如果该绑定是双向的,则有时会将旧值从特殊属性推回视图模型,并且验证错误似乎会触发此行为。如果ClipboardContentBinding 为空,DataGridBoundColumnsDataGridComboBoxColumns 将提供BindingSelectedItemBinding,因此如果将其中任何一个设置为TwoWay 绑定,则会出现此错误。

    如果您不设置Mode,它将为Default,并使用属性中的默认值,即TwoWay 用于TextBox.TextComboBox.SelectedItem,但OneWay 用于特殊剪贴板属性。

    【讨论】:

    • 我不明白这个ClipboardContentBinding 发生了什么以及受它影响的属性,但删除Mode=TwoWay 为我解决了这个问题。 Sooo...谢谢我猜。
    • 我想了解更多关于这个错误的信息,以及是否可以操纵 ClipboardContentBinding 本身来导致或删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多