2011-03-16 8 views
8

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

私はコンボボックスを使用すると、私は通常の背後にある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; 
} 

私はこの方法を選んだ理由はあります以下:

  • ocalization目的、最後に選択された項目を保存して読み込む際に選択された項目を決定するためにコンテンツ文字列を使用すべきではありません。
  • 簡潔にするため、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をバインドする方法はありませんし、このようなComboBoxItemのUIDに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> 

は、私はこの問題を解決する方法を知りたいです。 または、それを実装するより良い方法がありますか?それもいいですね。つまり、あなたが(定数で定義された)定数を返すプロパティを作成する必要があり

答えて

18

あなたはそうのような、StaticExtensionを使用したほうが良いでしょう:ローカルは、あなたのクラスのC#の名前空間のxmlnsの別名である

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

。詳細はhereを参照してください。

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

+0

ありがとう!これはまさに私が望んでいたものです!また、リークやオーバーヘッドに関連する情報は本当に便利です。 – Aki24x

2

ベスト:

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

これは財産になると、それは結合を経由して使用可能になります。

+0

ああ、そうです。これを短くする方法はありますか?つまり、C++なら#defineを使ってマクロを作ることができますが、できません。私はIValueConverterとEnumが、コード全体の量ではなく、ComboBoxに新しいUidを追加するときにこれを短くすることができるのだろうかと思います。 – Aki24x

+1

@ Aki24x:これはIValueConverterを介して可能性があり、XAMLの値を定数として指定します(バインディング経由ではありません)。これは、単一のIValueConverterが何らかの形でルックアップを行うことを可能にしますが、ルックアップのために何かが必要になります:辞書の名前、または列挙型を使用するか、... –

+0

参照してください。ありがとう、リード。 =) – Aki24x

関連する問題