我有一个带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}" />
有什么问题?
答案 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
查找过程会检查 请求资源中的密钥 由元素定义的字典 设置属性。
然后遍历查找过程 逻辑树向上,到 父元素及其资源 字典。这一直持续到 到达了根元素。
接下来,应用程序资源是 检查。应用资源是 资源中的那些资源 由...定义的字典 WPF的应用程序对象 应用。
主题资源字典是 检查,当前有效 主题。如果主题发生变化 运行时,重新评估该值。
检查系统资源。