2

ここに私のシナリオがあります。さまざまなタイトルとその 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

明らかに、有効なタイトルと無効なタイトルの個別のリストがあり、適切にバインドされていないアイテムは、無効なタイトル変数を参照できます。

私は調査fallbackValuesPriorityBindingsましたが、私がやろうとしていることにそれらを適合させる方法を見つけることができないようです. おそらく、ある種のコンバーターと一緒に使用され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();
    }
}
4

2 に答える 2

2

あなたがここで何を求めているのか理解できれば...

1)ビューモデル内のものを変更する必要があると思います-default結果がnullまたは空の場合は a を指定します(変更を通知するには INotifyPropertyChanged を実装する必要があります)。

2)他のオプションは、ある種のコンバーターです。これは、リストのプロパティを取得して使用しますMultiBinding

詳細については、私のこの投稿を参照してください (ほとんどのコードはそこにあります) - INotifyPropertyChanged で値コンバーターを更新する

基本的に、適切なプロパティ リストと「デフォルト リスト」の両方をバインドし、コンバーター内で何をすべきかを決定できます。

例えば:

<ComboBox  ...>
    <ComboBox.ItemsSource>
        <MultiBinding Converter="{StaticResource ImageConverter}" Mode="OneWay">
            <MultiBinding.Bindings>
                <Binding Path="TaskTitles" />
                <Binding Path="FallbackTitles" />
                <!--Binding Path="" /-->
            </MultiBinding.Bindings>
        </MultiBinding>
    </ComboBox.ItemsSource>
</ComboBox>
于 2013-04-25T16:43:40.547 に答える
0

ViewModel でコレクションを変更する必要があると思います。

  1. 許容値を読み込む (TaskTitles)
  2. 許可された値で選択された値 (tkttID) を確認します。存在しない場合は、追加します。

これを行うには、その内容を別の場所で管理できるように、TaskTitles にセッターを使用して auto プロパティを指定する必要があります。

例.(VS atmがないため、以下はテストされていません)。以下のLinqも使用しました。これは.NET 3以降だと思います。

public Dictionary<int, string> TaskTitles {get;set;}

public void Initialise()
{
TaskTitles = new Dictionary<int, string>();

foreach(var taskTitle in BestClass.taskTitles)
    TaskTitles.Add(taskTitle);

if(!TaskTitles.Any(t => t.Value == tkttid.Value))
    TaskTitles.Add(tkttid);



}

BestClass.taskTitles に追加するわけではないので、このコレクションは影響を受けないことに注意してください。新しいコレクションを作成し、同じ値に加えて (潜在的に) 1 つの別の値を追加しています。

于 2013-04-25T16:02:07.357 に答える