質問

CodeBehindのconst値にプロパティをバインドする良い方法はありますか?

コンボボックスを使用するとき、私は通常XAMLでこのようにして、次のようにコードをします。

xaml:

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

codebehind:

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

私がこのように選んだ理由は次のとおりです。

  • ローカリゼーションの目的では、コンテンツ文字列を使用して、最後に選択したアイテムの保存と読み込み中に選択されるアイテムを決定する必要はありません。
  • 簡単にするために、XAMLとCode-Behindは内部識別子を接続する必要があります(この場合、UID)。そのため、XamlとCode-Behindは個別に維持できます。

ただし、メンテナンスに関しては、内部識別子は次のような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 Valueにならないので、このようなcomboboxitemのuidにid_fooとid_barをバインドする方法はありません。

//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>

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

一番、

役に立ちましたか?

解決

使用する方がよいでしょう staticextension, 、 そのようです:

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

ローカルは、クラスのC#名前空間のXMLNSエイリアスです。より多くの情報を見つけることができます ここ.

バインディングを使用することの問題は、変化しないもののために多くのオーバーヘッドを追加していることです。バインディングはあなたの財産を監視しようとします。また、あります 既知の「リーク」 InotifyPropertyChangedを実装しないオブジェクトに非依存性プロパティを使用したバインディングを使用すること。

他のヒント

定数(constで定義)を返すプロパティを作成する必要があります。

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

これがプロパティに入ると、バインディングによって使用可能になります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top