ここに私のシナリオがあります。さまざまなタイトルとその IDのComboBox
場所がありitemssource
ます。Dictionary<int, string>
これらのタイトルは、将来のある時点で無効になる可能性があるため、今後は表示されComboBox
ません。ただし、古いアイテムを表示するときは、現在アクティブなタイトルに加えて、この古い値を表示できる必要があります。以下でもう少しよく視覚化してみます。
今日:
ComboBox アイテムは以下で構成されます。
- 1、タイトル1
- 2、タイトル2
- 3、タイトル3
Title3 が選択され、ID (3) が格納されます。
明日:
Title3 が無効になり、Title4 が追加されるため、アイテムは次のようになります。
- 1、タイトル1
- 2、タイトル2
- 4、タイトル4
ただし、昨日の値がバインドしている値 (ID 3) である場合、一致するアイテムはありません。理想的には、次のように古いアイテムを最後に追加したいと思います。
- 1、タイトル1、
- 2、タイトル2
- 4、タイトル4
- 3、タイトル3
明らかに、有効なタイトルと無効なタイトルの個別のリストがあり、適切にバインドされていないアイテムは、無効なタイトル変数を参照できます。
私は調査fallbackValues
しPriorityBindings
ましたが、私がやろうとしていることにそれらを適合させる方法を見つけることができないようです. おそらく、ある種のコンバーターと一緒に使用されfallbackValue
ますか?ヘルプとフィードバックに感謝します。
また、参考までに、これは私が現在作業しているコードです (データグリッドでこれを実行しようとしています)。
WPF:
<DataGridTemplateColumn x:Name="tkTitle" Header="Title" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox ItemsSource="{Binding DataContext.TaskTitles, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}}" SelectedValue="{Binding Path=tkttID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Key" DisplayMemberPath="Value" Width="Auto" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
ViewModel の関連コード:
public Dictionary<int, string> TaskTitles
{
get
{
return BestClass.taskTitles;
}
}
編集 - 作業コード これは、すべてを機能させるために使用したコードです。ItemsSource は、コンバーターを使用して MultiBinding に更新されました。MultiBinding には、Active TaskTitles、All TaskTitles、および ID が含まれます。これらはすべてコンバーターに渡されるため、ID はアクティブ リストでチェックされ、アクティブでない場合は追加されます。助けてくれてありがとう!
WPF
<DataGridTemplateColumn x:Name="tkTitle" Header="Title" Width="150">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<ComboBox SelectedValue="{Binding Path=tkttID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" SelectedValuePath="Key" DisplayMemberPath="Value" Width="Auto">
<ComboBox.ItemsSource>
<MultiBinding Converter="{StaticResource CheckDisabledTaskTitle}" Mode="OneWay">
<MultiBinding.Bindings>
<Binding Path="DataContext.TaskTitles" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}" />
<Binding Path="DataContext.AllTaskTitles" RelativeSource="{RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGrid}}" />
<Binding Path="tkttID" />
</MultiBinding.Bindings>
</MultiBinding>
</ComboBox.ItemsSource>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
コンバーターのコードビハインド
class CheckDisabledTaskTitle : IMultiValueConverter
{
//values[0] - Active values
//values[1] - All values (including disabled)
//values[2] - Current ID
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
//Check to see if the active values contain our current ID
if (((Dictionary<int, string>)values[0]).ContainsKey((int)values[2]))
{
//They do, so return just the active values
return values[0];
}
else
{
//They don't, so we'll add only our disabled value to the active list
((Dictionary<int, string>)values[0]).Add((int)values[2], ((Dictionary<int, string>)values[1])[((int)values[2])]);
//Then give that back
return values[0];
}
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
throw new NotImplementedException();
}
}