Если я настрою новое приложение 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"); }
}