2

我有一个带有 ComboBox 的 DataGrid 模板列。当我选择一个值并按 Enter 时,绑定的数据不会更新(我看到空单元格)。

XAML:

<Window x:Class="WpfGrid2.Window2"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:sys="clr-namespace:System;assembly=mscorlib"
  xmlns:dg="clr-namespace:Microsoft.Windows.Controls;assembly=WpfToolkit"
  >

    <Window.Resources>
        <x:Array x:Key="people" Type="sys:Object" />

        <x:Array x:Key="knownLastNames" Type="sys:String">
            <sys:String>Smith</sys:String>
            <sys:String>Johnson</sys:String>
            <sys:String>Williams</sys:String>
        </x:Array>
    </Window.Resources>

    <StackPanel>
        <dg:DataGrid x:Name="_grid" ItemsSource="{DynamicResource people}" CanUserAddRows="True" AutoGenerateColumns="False">
            <dg:DataGrid.Columns>

                <dg:DataGridTemplateColumn Header="LastName" MinWidth="100">
                    <dg:DataGridTemplateColumn.CellEditingTemplate>
                        <DataTemplate>
                            <ComboBox ItemsSource="{DynamicResource knownLastNames}" SelectedItem="{Binding LastName}"></ComboBox>
                        </DataTemplate>
                    </dg:DataGridTemplateColumn.CellEditingTemplate>
                    <dg:DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <TextBlock Text="{Binding LastName}" />
                        </DataTemplate>
                    </dg:DataGridTemplateColumn.CellTemplate>
                </dg:DataGridTemplateColumn>

            </dg:DataGrid.Columns>
        </dg:DataGrid>

        <Button>test</Button>
    </StackPanel>
</Window>

代码隐藏:

namespace WpfGrid2
{
    public partial class Window2 : Window
    {
        public Window2()
        {
            InitializeComponent();

            List<Person> people = new List<Person>();
            this.Resources["people"] = people;
        }
    }
}

如果我将 ComboBox 更改为 TextBox,它可以正常工作

<TextBox Text="{Binding LastName}" />

怎么了?

4

2 回答 2

1

我不知道这是否是解决您的问题的可行解决方案,但是如果您将 Combo-Box 的 ItemsSource 绑定更改为 StaticResource,则该绑定有效。

...

<ComboBox ItemsSource="{StaticResource knownLastNames}" ... />

...

我很确定发生的事情是,当 ComboBox 被卸载时(当 EditTemplate 由于提交新记录而被卸载时),DynamicResource 尝试再次查找资源并失败(因为 ComboBox 不再在视觉树,它不会在可视化树中找到它上面定义的资源)。这会将 ItemsSource 设置为 null,并将 SelectedItem 设置为 null,从而将 LastName 设置为 null。

使用 StaticResource,在显示 ComboBox 之前只搜索一次集合,因此它不会重置为 null。

于 2009-03-30T22:09:40.870 回答
0

另一种选择(遵循“Abe Heidebrecht”答案的逻辑)是将“knownLastNames”移动到 Application.Resources。见第 3 点。

动态资源查找行为

  1. 查找过程在设置属性的元素定义的资源字典中检查请求的键。

  2. 查找过程然后向上遍历逻辑树,到达父元素及其资源字典。这一直持续到到达根元素。

  3. 接下来,检查应用程序资源。应用程序资源是由 WPF 应用程序的 Application 对象定义的资源字典中的那些资源。

  4. 为当前活动的主题检查主题资源字典。如果主题在运行时发生变化,则重新评估该值。

  5. 检查系统资源。

于 2009-03-30T22:57:56.213 回答