В таблице есть две колонки, обе они имеют тип DataGridComboBoxColumn. В первой колонке надо показывать выпадающий список из одной коллекции, во второй колонке выпадающий список должен заполняться на основе перечисления (Enum).
К таблице привязана коллекция SortLevels объектов типа SortLevel, свойства которых должны меняться через выпадающие списки.
Пытался по разному описывать привязку данных в комбо-боксы, не получается ничего, выводятся пустые выпадающие списки. В результате нужно иметь сформированную коллекцию SortLevels, объекты в которой редактируются через комбо-боксы.
Объект строки таблицы:
public class SortLevel
{
public GridColumn Column { get; set; }
public SortOrder Order { get; set; }
}
Описание колонки:
public class GridColumn
{
public int Id { get; set; }
public string Name { get; set; }
}
Перечисление типа сортировки:
public enum SortOrder
{
ASC,
DESC
}
Разметка XAML:
<Grid x:Name="LayoutRoot">
<Grid.RowDefinitions>
<RowDefinition Height="auto" />
<RowDefinition Height="*" />
</Grid.RowDefinitions>
<StackPanel Grid.Row="0" Orientation="Horizontal">
<Button Command="{Binding AddSortLevelCommand}" Content="+ level" />
<Button Command="{Binding RemoveSortLevelCommand}" Content="- level" />
</StackPanel>
<DataGrid
Grid.Row="1"
AutoGenerateColumns="False"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserSortColumns="False"
ItemsSource="{Binding SortLevels}"
SelectedItem="{Binding SelectedSortLevel}">
<DataGrid.Columns>
<DataGridComboBoxColumn
Width="*"
DisplayMemberPath="Name"
Header="Column"
ItemsSource="{Binding Columns}"
SelectedValuePath="Id" />
<DataGridComboBoxColumn
Width="*"
Header="Order"
ItemsSource="{Binding SortOrder}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
Код ВМ:
public class MainViewModel : ViewModelBase
{
public ObservableCollection<GridColumn> Columns { get; set; }
public ObservableCollection<SortLevel> SortLevels { get; set; }
private SortLevel selectedSortLevel;
public SortLevel SelectedSortLevel
{
get { return selectedSortLevel; }
set
{
if (Set(ref selectedSortLevel, value) == true)
{
RemoveSortLevelCommand.RaiseCanExecuteChanged();
}
}
}
public RelayCommand AddSortLevelCommand { get; private set; }
public RelayCommand RemoveSortLevelCommand { get; private set; }
/// <summary>
/// Initializes a new instance of the MainViewModel class.
/// </summary>
public MainViewModel()
{
Columns = new ObservableCollection<GridColumn>()
{
new GridColumn() { Id = 0, Name = "0"},
new GridColumn() { Id = 1, Name = "1"},
new GridColumn() { Id = 2, Name = "2"},
new GridColumn() { Id = 3, Name = "3"},
};
SortLevels = new ObservableCollection<SortLevel>();
AddSortLevelCommand = new RelayCommand(AddSortLevel);
RemoveSortLevelCommand = new RelayCommand(RemoveSortLevel, CanRemoveSortLevel);
}
private void AddSortLevel()
{
var sortLevel = new SortLevel()
{
Order = SortOrder.ASC,
Column = Columns.First()
};
SortLevels.Add(sortLevel);
}
private void RemoveSortLevel()
{
SortLevels.Remove(SelectedSortLevel);
}
private bool CanRemoveSortLevel()
{
return SelectedSortLevel != null;
}
}
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости