Я нашел несколько примеров на этом сайте, но я не смог найти ничего, что я мог бы использовать в моем случае.
У меня есть 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>