3

このアプリケーションには、ComboBoxリストなどのデータディクショナリとして機能する非常に大きなデータセットがあります。このデータは静的にキャッシュされ、2つの変数からキーオフされるため、ComboBoxから派生して公開されるコントロールを作成するのが賢明だと思いました。 DPとしての2つのキー。これらの2つのキーに適切な値がある場合、対応するデータディクショナリリストからComboBoxのItemsSourceを自動的に設定します。また、コンストラクターのSelectedValuePathとDisplayMemberPathをそれぞれCodeとDescriptionに自動的に設定します。

データディクショナリリストのItemsSource内のアイテムが常にどのように見えるかの例を次に示します。

public class DataDictionaryItem
{
    public string Code { get; set; }
    public string Description { get; set; }
    public string Code3 { get { return this.Code.Substring(0, 3); } }
}

Codeの値は常に4文字の長さですが、3文字だけバインドする必要がある場合もあります。したがって、Code3プロパティ。

ItemsSourceを設定するためのカスタムコンボボックス内のコードは次のようになります。

private static void SetItemsSource(CustomComboBox combo)
{
    if (string.IsNullOrEmpty(combo.Key1) || string.IsNullOrEmpty(combo.Key2))
    {
        combo.ItemsSource = null;
        return;
    }

    List<DataDictionaryItem> list = GetDataDictionaryList(combo.Key1, combo.Key2);
    combo.ItemsSource = list;
}

さて、私の問題は、XAMLのSelectedValuePathをCode3に変更すると、機能しないことです。SelectedValueにバインドすると、DataDictionaryItemから完全な4文字のコードが取得されます。SelectedValuePathが変更され、サイコロがない場合でも、SetItemsSourceを再実行してみました。

カスタムコンボボックスをウェイクアップさせ、XAMLでオーバーライドされた場合に提供されるSelectedValuePathを使用するために、私が何をする必要があるかを誰かが理解できますか?SelectedValueバインドされたビジネスオブジェクトのプロパティセッターの値を微調整することはオプションではありません。

XAMLがフォームでコンボボックスを検索する方法は次のとおりです。

<c:CustomComboBox Key1="0" Key2="8099" SelectedValuePath="Code3" SelectedValue="{Binding Thing}"/>

編集:コードでスヌープを実行したところ、SelectedValuePathがコードであると表示されます...Code3に設定されていないようです...Zuh?

4

1 に答える 1

4

わかりました、私はそれを理解しました。

どうやら、WPF コントロールの既定の非静的コンストラクターで DependencyProperty の既定値を設定することはできません。だから、最初はこれを試しました:

static ValueCodeListComboBox()
{
  SelectedValuePathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new PropertyMetadata("Code"));
  DisplayMemberPathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new PropertyMetadata("Description"));
}

しかし、これは次のようなエラーをスローし続けました:

メタデータ オーバーライドとベース メタデータは、同じ型または派生型である必要があります。

最後に、PropertyMetadata の代わりに FrameworkPropertyMetadata を使用する必要があることを意味することがわかりました。

static ValueCodeListComboBox()
{
  SelectedValuePathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new FrameworkPropertyMetadata("Code"));
  DisplayMemberPathProperty.OverrideMetadata(typeof(ValueCodeListComboBox), new FrameworkPropertyMetadata("Description"));
}

XAML で SelectedValuePath を変更すると、うまく機能するようになりました。

于 2010-03-09T13:16:34.397 に答える