使用ComboBox的DataGridTemplateColumn问题

时间:2009-03-30 21:38:34

标签: wpf wpftoolkit

我有一个带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}" />

有什么问题?

2 个答案:

答案 0 :(得分:1)

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

...

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

...

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

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

答案 1 :(得分:0)

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

Dynamic resource lookup behavior

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

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

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

  4. 主题资源字典是 检查,当前有效 主题。如果主题发生变化 运行时,重新评估该值。

  5. 检查系统资源。