Как сделать WPF DataGridColumn связанным, редактируемым ComboBox, в котором изменения элементов распространяются на другие строки?

1
8

Я использую 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 г.

1 Ответ

2
Август
Ответ получен9 сентября 2024 г.

Ваш ответ

Загрузить файл.