Я использую WPF DataGrid, привязанный к коллекции. Один из столбцов будет ComboBox. Я хочу, чтобы ComboBox можно было редактировать, а также чтобы любые изменения текста распространялись на все остальные элементы в коллекции, которые ранее использовали то же значение.
Вот мой XAML:
а вот мой code:
Так, например, если любимый цвет Крейга изменится на "BlueGreen", то и у Боба он должен обновиться одновременно:
Я довольно близко подошел к цели, обрабатывая событие ComboBox.TextBoxBase.TextChanged, но это становилось достаточно сложным, чтобы заставить меня задуматься о том, что должен быть более простой способ.
<Window x:Class="WpfApp1.MainWindow"
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:WpfApp1"
mc:Ignorable="d"
DataContext="{Binding RelativeSource={RelativeSource Self}}"
Title="MainWindow" Height="450" Width="800">
<DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Students}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name" Binding="{Binding Name}" IsReadOnly="True" />
<DataGridTemplateColumn Header="Favorite Color">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox IsEditable="True" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=Colors}" Text="{Binding FavoriteColor}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
</Window>
public class Student : INotifyPropertyChanged
{
private string favoriteColor;
public string Name { get; set; }
public string FavoriteColor
{
get { return favoriteColor; }
set
{
favoriteColor = value;
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("FavoriteColor"));
}
}
public Student(string name, string favoriteColor)
{
Name = name;
this.favoriteColor = favoriteColor;
}
public event PropertyChangedEventHandler PropertyChanged;
}
public partial class MainWindow : Window
{
public ObservableCollection<Student> Students { get; set; } = new ObservableCollection<Student>(new Student[] { new Student("Alice", "Red"), new Student("Bob", "Blue"), new Student("Craig", "Blue") });
public List<string> Colors { get; set; } = new List<string>();
public MainWindow()
{
InitializeComponent();
Colors.AddRange(Students.Select(x => x.FavoriteColor).Distinct());
}
}
Кузьма
Вопрос задан8 сентября 2024 г.