Проблемы с DataGridTemplateColumn с ComboBox - PullRequest
2 голосов
/ 31 марта 2009

У меня есть столбец шаблона DataGrid с ComboBox. Когда я выбираю значение и нажимаю ввод, связанные данные не обновляются (я вижу пустую ячейку).

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>

Code-Behind:

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 ]

1 голос
/ 31 марта 2009

Я не знаю, является ли это возможным решением вашей проблемы, но если вы измените привязку ItemsSource Combo-Box на StaticResource, привязка сработает.

...

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

...

Я почти уверен, что происходит то, что при выгрузке ComboBox (когда выгрузка EditTemplate из-за отправки новой записи), DynamicResource пытается снова выполнить поиск ресурса и завершается неудачей (поскольку ComboBox больше не в визуальном дереве он не найдет ресурс, определенный над ним в визуальном дереве). Это установит для ItemsSource значение null, а также для SelectedItem значение null, таким образом, установив для LastName значение null.

При использовании StaticResource коллекция ищется только один раз, прежде чем отображается ComboBox, поэтому она не сбрасывается в ноль.

0 голосов
/ 31 марта 2009

Другой альтернативой (следуя логике ответа «Abe Heidebrecht») является перемещение «knownLastNames» в Application.Resources. См. Пункт № 3.

Динамическое поведение при поиске ресурсов

  1. Процесс поиска проверяет наличие запрашиваемый ключ внутри ресурса словарь, определенный элементом который устанавливает свойство.

  2. Затем выполняется поиск логическое дерево вверх, к родительский элемент и его ресурс толковый словарь. Это продолжается до корневой элемент достигнут.

  3. Далее ресурсы приложения проверено. Ресурсы приложения эти ресурсы внутри ресурса словарь, который определяется Объект приложения для вашего WPF приложение.

  4. Словарь ресурсов темы проверено, для текущего активного тема. Если тема меняется на время выполнения, значение переоценивается.

  5. Системные ресурсы проверены.

...