9

コードビハインドでプロパティを const 値にバインドする良い方法はありますか?

ComboBox を使用するときは、通常、xaml とコード ビハインドで次のようにします。

XAML:

<ComboBox Name="cbBuz">
   <ComboBoxItem Content="foo" Uid="foo" IsSelected="true" />
   <ComboBoxItem Content="bar" Uid="bar" />
</ComboBox>

コードビハインド:

ComboBoxItem item = cbBuz.GetSelectedItem();
switch (item.Uid)
{
    case "foo":  ... break;
    case "bar":  ... break;
}

この方法を選んだ理由は次のとおりです。

  • ローカリゼーションの目的で、最後に選択した項目の保存および読み込み中にどの項目が選択されたかを判断するためにコンテンツ文字列を使用しないでください。
  • 簡単にするために、XAML とコード ビハインドは内部識別子 (この場合は Uid) に接続する必要があります。そのため、XAML とコード ビハインドを別々に管理できます。

ただし、メンテナンスに関しては、内部識別子は次のように 1 か所で定義する必要があります。

//IDs
public const string ID_foo = "foo";
public const string ID_bar = "bar";

...

//
switch (item.Uid)
{
    case ID_foo:  ... break;
    case ID_bar:  ... break;
}

問題は、プロパティが const 値にできないように見えるため、次のように ID_foo と ID_bar を ComboBoxItem の Uid にバインドする方法がないことです。

//If ID_foo and ID_bar are properties, this will work.
<ComboBox Name="cbBuz">
   <ComboBoxItem Content="foo" Uid="{Binding ID_foo}" IsSelected="true" />
   <ComboBoxItem Content="bar" Uid="{Binding ID_bar}" />
</ComboBox>

だから、この問題を解決する方法を知りたいです。または、それを実装するためのより良い方法はありますか。それもいいでしょう。

一番、

4

2 に答える 2

32

次のようにStaticExtensionを使用する方がよいでしょう。

Uid="{x:Static local:YourClass.ID_foo}"

local は、クラスの C# 名前空間の xmlns エイリアスです。詳細については、こちらをご覧ください

Binding を使用する際の問題は、決して変更されないものに対して多くのオーバーヘッドを追加していることです。バインディングは、プロパティを監視しようとします。また、INotifyPropertyChanged を実装しないオブジェクトで非依存プロパティを持つ Binding を使用すると、既知の "リーク"が発生します。

于 2011-03-16T22:55:14.290 に答える
2

定数 (const で定義) を返すプロパティを作成する必要があります。つまり、次のようになります。

private const string ID_Foo = "foo";
public string FooId
{
   get { return ID_Foo; }
}

これがプロパティに含まれると、バインディングを介して使用できるようになります。

于 2011-03-16T22:25:40.273 に答える