DataGridComboBoxColumnsで選択した項目で要素バインディングを使用することはできますか?DataGridComboBoxColumnの要素バインド
ObservableCollection型のプロパティ "ListOfSomeTypes"を含むMyObjectオブジェクトがいくつかあります。 SomeTypeはINotifyPropertyChangedを実装します。
SomeTypeのリストをDataGridに表示する必要があります。 "ListOfSomeTypes"の場合、私は次のことを行うためのソリューションを探しています:DataGridには2つのカラムがあります。 1つは固定された整数のリストを持つDataGridComboBoxColumnです。 {0,1,2,3}。その列のItemsSourceは、Binding(MyObjectの一部ではないプロパティ "ListOfIndices")を介して設定されます。 2番目の列は、(別の列の)選択したインデックス位置に "ListOfSomeTypes"の内容を表示する必要があります。 だから私は、両方の値をチェックし、表示するための正しい値を選択するのに、マルチコンバータを使うことができると思った。問題は、コンボボックスが私のインデックスリストの最初の項目を表示するにもかかわらず、インデックスであると思われる値が決して設定されない(null)ということです。
インデックスは表示にのみ必要なので、私はMyObjectクラスに "SelectedIndex"プロパティを持たせたくありません。要素バインディングでコンボボックスの選択した値にアクセスすることは可能ですか? 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;
}
ありがとう:
これは私のコードです!
"MyObject"クラスに何らかの "SelectedIndex"プロパティを持たなければならないということですか? – tabina
はい、正確です。 ... – mm8