Как связать список пользовательских объектов с DataGridComboboxColumn в WPF? - PullRequest
0 голосов
/ 14 ноября 2018

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

У меня есть DataGrid с AutoGeneratedColumn="False" и ViewModel, который связан с DataContext моего Окна, в котором находится DataGrid. В моем ViewModel у меня есть список структуры данных с именем Model, которая связана со свойством ItemsSource моего DataGrid.

Модель содержит Enum. Мне удалось сгенерировать DataGridComboboxColumn для перечисления, но я не знаю, как архивировать то же самое для списка объектов.

Вот мой Model.cs класс.

public class Model
{
    public CType Type { get; set; }
    public Person Person { get; set; }
    public Condition Condition { get; set; }
}

public class Person
{
    public List<Trait> Traits { get; set; }
    public string Name { get; set; }
}

public class Condition
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Value { get; set; }
}

public class Trait
{
    public string Name { get; set; }
    public List<Reason> Reasons { get; set; }
}

public class Reason
{
    public string Name { get; set; }
}

Вот мой класс ViewModel.cs с предварительно заполненными объектами типа Model.

public class ViewModel
{
    //Bind to Grid - ItemsSource
    public ObservableCollection<Model> Models { get; set; }

    //Possible ComboboxValues for Column: Model.Person
    public ObservableCollection<Person> Persons { get; set; }

    //Possible ComboboxValues for Column: Model.Condition
    public ObservableCollection<Condition> Conditions { get; set; }

    public ViewModel()
    {
        Models = new ObservableCollection<Model>();

        #region Model1
        Model model = new Model();
        model.Condition = new Condition()
        {
            Id = 1,
            Name = "Hallo",
            Value = 5
        };
        model.Type = CType.One;
        model.Person = new Person()
        {
            Name = "Peter",
            Traits = new List<Trait>()
            {
                new Trait()
            {
                Name = "Trait 1",
                Reasons = new List<Reason>()
                {
                    new Reason() { Name = "Reason 1" },
                    new Reason() { Name = "Reason 2" }
                }
            },
            new Trait()
            {
                Name = "Trait 2",
                Reasons = new List<Reason>()
                {
                    new Reason() { Name = "Reason 3" },
                    new Reason() { Name = "Reason 4" }
                }
            }
            }
        };
        #endregion

        #region Model2 
        Model model2 = new Model();
        model2.Condition = new Condition()
        {
            Id = 1,
            Name = "Welt",
            Value = 5
        };
        model2.Type = CType.Three;
        model2.Person = new Person()
        {
            Name = "Manuel",
            Traits = new List<Trait>()
            {
                new Trait()
                {
                    Name = "Trait 3",
                    Reasons = new List<Reason>()
                    {
                        new Reason() { Name = "Reason 5" },
                        new Reason() { Name = "Reason 6" }
                    }
                },
                new Trait()
                {
                    Name = "Trait 4",
                    Reasons = new List<Reason>()
                    {
                        new Reason() { Name = "Reason 7" },
                        new Reason() { Name = "Reason 8" }
                    }
                }
            }
        };
        #endregion

        Persons = new ObservableCollection<Person>()
        {
            model.Person, model2.Person
        };

        Conditions = new ObservableCollection<Condition>()
        {
            model.Condition, model2.Condition
        };

        Models.Add(model);
        Models.Add(model2);
    }
}

И это мой Window.xaml файл с примером рабочего перечисления. И последнее, но не менее важное: у вас есть свойство DataContext для нового экземпляра класса ViewModel в коде позади.

<Window x:Class="WpfApp2.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:WpfApp2"
    xmlns:sys="clr-namespace:System;assembly=mscorlib"
    mc:Ignorable="d"
    Title="MainWindow" Height="450" Width="800">
<Window.Resources>
    <ObjectDataProvider x:Key="myEnumData"
            MethodName="GetValues" 
            ObjectType="{x:Type sys:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:CType" />
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</Window.Resources>
<Grid>
    <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Models}">
        <DataGrid.Columns>
            <DataGridComboBoxColumn 
                Header="Enum"
                ItemsSource="{Binding Source={StaticResource myEnumData}, Mode=OneWay}"
                SelectedValueBinding="{Binding Path=Type}">
            </DataGridComboBoxColumn>

            <!--ComboBox for Persons-->
            <DataGridComboBoxColumn>

            </DataGridComboBoxColumn>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

1 Ответ

0 голосов
/ 14 ноября 2018

Попробуйте это:

<DataGridComboBoxColumn Header="Person" DisplayMemberPath="Name" SelectedItemBinding="{Binding Person}">
    <DataGridComboBoxColumn.ElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding DataContext.Persons, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
        </Style>
    </DataGridComboBoxColumn.ElementStyle>
    <DataGridComboBoxColumn.EditingElementStyle>
        <Style TargetType="ComboBox">
            <Setter Property="ItemsSource" Value="{Binding DataContext.Persons, RelativeSource={RelativeSource AncestorType=DataGrid}}" />
        </Style>
    </DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
...