Привязка элемента к DataGridComboBoxColumn
Можно ли использовать связывание элементов с выбранным элементом DataGridComboBoxColumns?
У меня есть некоторый объект MyObject, который содержит свойство "ListOfSomeTypes" типа ObservableCollection. SomeType реализует INotifyPropertyChanged.
Список SomeType должен отображаться в DataGrid. Для "ListOfSomeTypes" я ищу решение, чтобы сделать следующее: DataGrid имеет два столбца. Одним из них является DataGridComboBoxColumn с фиксированным списком целых чисел, например, {0,1,2,3}. ItemsSource этого столбца устанавливается через Binding (свойство ListOfIndices, которое не является частью MyObject). Во втором столбце должно отображаться содержимое "ListOfSomeTypes" в выбранной позиции индекса (из другого столбца). Поэтому я подумал, что мог бы просто использовать MultiConverter, чтобы проверить значения обоих и выбрать правильное значение для отображения. Проблема в том, что значение, которое должно быть индексом, никогда не устанавливается (ноль), хотя в выпадающем списке отображается первый элемент моего списка индексов.
Поскольку индексы запрашиваются только для отображения, я не хочу иметь свойство "SelectedIndex" в моем классе MyObject. Можно ли получить доступ к выбранному значению комбинированного списка с привязкой элемента? Какое свойство нужно использовать (поскольку SelectedValueBinding кажется неправильным)? Или есть лучший способ?
Это мой код:
<DataGridCheckBoxColumn Header="SomeType">
<DataGridCheckBoxColumn.Binding>
<MultiBinding Converter="converters:SomeTypeCodeToBoolMultiConverter}">
<Binding Path="ListOfSomeTypes" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"/>
<Binding ElementName="dgcbcSelectedIndex" Path="SelectedValueBinding"
UpdateSourceTrigger="PropertyChanged"/>
</MultiBinding>
</DataGridCheckBoxColumn.Binding>
</DataGridCheckBoxColumn>
<DataGridComboBoxColumn x:Name="dgcbcSelectedIndex" Header="Indices">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=Data.ListOfIndices, Source={StaticResource proxy}, UpdateSourceTrigger=PropertyChanged}" />
<Setter Property="IsSynchronizedWithCurrentItem" Value="True"/>
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="ComboBox">
<Setter Property="ItemsSource" Value="{Binding Path=Data.ListOfIndices, Source={StaticResource proxy}, UpdateSourceTrigger=PropertyChanged}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
Конвертер
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values == null || values.Length != 2)
return null;
var listOfSomeTypes= (ObservableCollection<SomeType>) values[0];
if (listOfSomeTypes!= null)
{
int selectedIndex = 0;
if (values[1] != null)
{
try { selectedIndex = (int)values[1]; }
catch (Exception) { }
}
if (listOfSomeTypes.Count > selectedIndex )
{
var someType= listOfSomeTypes[selectedIndex ];
return someType == TypeA;
}
}
return null;
}
Спасибо за вашу помощь!
1 ответ
Можно ли использовать связывание элементов с выбранным элементом DataGridComboBoxColumns?
Краткий ответ: Нет.
DataGridCheckBox
Столбец не знает, что такое "dgcbcSelectedIndex". DataGridComboBoxColumn
не является визуальным элементом, который добавляется в визуальное дерево. Это тип, который в конечном итоге создает ComboBox
элемент, так что это не сработает.
Что вы должны сделать, это связать выбранный элемент / индекс / значение ComboBox
к свойству источника вашего объекта данных, а затем привязать CheckBox
к тому же исходному свойству. Вы не можете использовать ElementName
,