Полный XAML и код-код приведены ниже. У меня есть окно с DataGrid с одним столбцом, DataGridComboBoxColumn. В его EditingElementStyle я установил редактируемые ComboBox-es и установил для их ItemsSource ту же коллекцию, к которой я привязал свойство ElementStyle. Кажется, что привязки работают хорошо, пока я не запустил программу и не попытался изменить значение ячейки на другое значение. Хотя в настоящее время я выбираю только из существующих значений (в будущем я хочу разрешить ввод пользовательских элементов), значение не сохраняется, а предыдущее значение отображается после перемещения фокуса.
Если я поставлю только это в окне:
<StackPanel Orientation="Vertical">
<ComboBox ItemsSource="{Binding Path=MyGroups,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}" IsEditable="True"/>
<ComboBox ItemsSource="{Binding Path=MyGroups,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}" IsEditable="True"/>
</StackPanel>
Кажется, все работает.
1008 * XAML *
<Window x:Class="cs_wpf_test_11.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:cs_wpf_test_11"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
mc:Ignorable="d"
Title="TestWindow" Height="450" Width="800">
<Grid>
<DataGrid Name="MyDataGrid" AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridComboBoxColumn Header="My only column"
SelectedItemBinding="{Binding Value, Mode=TwoWay}"
TextBinding="{Binding Value}">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=MyGroups,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="IsEditable" Value="True"/>
<Setter Property="ItemsSource" Value="{Binding Path=MyGroups,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"/>
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
Код-за
public partial class TestWindow : Window
{
public ObservableCollection<ItemType> MyItems { get; set; }
public ObservableCollection<string> MyGroups { get; set; }
public TestWindow()
{
InitializeComponent();
MyGroups = new ObservableCollection<string>();
MyGroups.Add("test");
MyGroups.Add("test 2");
MyItems = new ObservableCollection<ItemType>();
MyItems.Add(new ItemType()
{
Value = "test"
});
MyItems.Add(new ItemType()
{
Value = "test 2"
});
MyDataGrid.ItemsSource = MyItems;
}
}
public class ItemType : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged(string name)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(name));
}
protected string _Value = "";
public string Value
{
get
{
return _Value;
}
set
{
if (_Value != value)
{
_Value = value;
OnPropertyChanged("Value");
}
}
}
}
Ожидаемое:
- Пользователь выбирает ячейку,
- входит в режим редактирования (двойным щелчком или F2) и
- выбирает из раскрывающегося списка другое значение, чем указанное ранее.
- Пользователь меняет выбранную ячейку на другую
- и ранее сфокусированная ячейка остается с новым выбранным значением.
Факт: пользователь выполняет те же действия, что и выше, но при фокусировке другой ячейки после выбора нового значения ранее сфокусированная ячейка остается с начальным значением.