WPF ComboBox в DataGrid не работает привязка / обновление данных - PullRequest
7 голосов
/ 14 апреля 2011

Если я настрою новое приложение WPF в Visual Studio 2010 и добавлю следующий код + XAML, откроется сетка данных со списками внутри.Проблема в том, что изменение значения с помощью комбинированного списка не распространяется на связанную модель данных.Другими словами: свойство с именем MyValue никогда не устанавливается.Это заняло у меня несколько часов, и я понятия не имею, почему это не работает.Также много похожих тем и предложений не было.

Здесь XAML.Это просто простое окно с DataGrid.В DataGrid есть столбец шаблона, в котором установлены CellTemplate и CellEditingTemplate.Оба содержат ComboBox, который заполнен списком из раздела ресурсов.ComboBox.SelectedItem привязан к MyItem.MyValue:

<Window x:Class="DataGridComboBoxExample.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"    xmlns:local="clr-namespace:DataGridComboBoxExample">

    <Window.Resources>

        <local:MyItemList x:Key="ItemList"/>

        <DataTemplate x:Key="NotificationModeDataTemplate">
            <ComboBox
                ItemsSource="{StaticResource ItemList}"
                SelectedItem="{Binding Path=MyValue, Mode=OneWay}" />
        </DataTemplate>
        <DataTemplate x:Key="NotificationModeEditTemplate">
            <ComboBox
                ItemsSource="{StaticResource ItemList}"
                SelectedItem="{Binding Path=MyValue, Mode=TwoWay}" />
        </DataTemplate>

    </Window.Resources>

    <Grid>
        <DataGrid x:Name="myDataGrid" AutoGenerateColumns="False">
            <DataGrid.Columns>
                <DataGridTemplateColumn
                    Header="Test" Width="100"
                    CellTemplate="{StaticResource NotificationModeDataTemplate}"
                    CellEditingTemplate="{StaticResource NotificationModeEditTemplate}" />
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

Здесь код.Он содержит главный оконный ctor, который просто устанавливает DataContext.MyItem - модель данных строки, поддерживающая INotifyPropertyChanged.MyItemList - это список вариантов, привязанных к ComboBox.ItemsSource.

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        myDataGrid.ItemsSource = new List<MyItem> 
        {
            new MyItem { MyValue = "i0" },
            new MyItem { MyValue = "i1" },
            new MyItem { MyValue = "i0" },
        };
    }
}

public class MyItem : INotifyPropertyChanged
{
    public string MyValue
    {
        get { return myValue; }
        set
        {
            myValue = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("MyValue"));
            }
        }
    }
    private string myValue;

    public event PropertyChangedEventHandler PropertyChanged;
}

public class MyItemList : List<string>
{
    public MyItemList() { Add("i0"); Add("i1"); Add("i2"); }
}

1 Ответ

14 голосов
/ 15 апреля 2011

Я подозреваю, что вам нужно будет сделать привязку SelectedItem обновить источник на PropertyChanged, чтобы это работало.

SelectedItem = "{Binding Path = MyValue, Mode = TwoWay, UpdateSourceTrigger = PropertyChanged } "

Я бы заставил CellTemplate и CellEditingTemplate ссылаться на ваш шаблон редактирования во время отладки, чтобы исключить другой, не относящийся к делу шаблон, пока вы не разобрались с ним.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...