2011-03-16 22 views
8

Bir özelliği codebehind'de const değerine bağlamak için iyi bir yol var mı? Ben ComboBox kullandığınızdaWPF içinde xaml kodunun arkasındaki kodda const üyesine

, genellikle arkasında xaml ve kodda bu şekilde yaparsak:

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; 
} 
bu şekilde bu nedenle seçtik

izleyen:

  • l için ocalization amacı, seçilen bir öğenin kaydedilmesi ve yüklenmesi sırasında hangi öğenin seçildiğini belirlemek için İçerik dizesi kullanılmamalıdır.
  • Basitlik için, XAML ve kod arkasına iç tanımlayıcı bağlanmalıdır (Bu durumda, Uid). Böylece, XAML ve Code-behind ayrı ayrı tutulabilir.

Ancak, bakım-bilge, dahili tanımlayıcı böyle bir yerde tanımlanmalıdır: Sorun görünüşte özellik const değer olamaz edilir

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

... 

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

yüzden ID_foo bağlamak için hiçbir yolu yoktur ve böyle ComboBoxItem ait Uid için 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> 

Yani, bu sorunu çözmek için nasıl bilmek istiyorum. Veya, onu uygulamak için daha iyi bir yolu var mı. Çok da güzel olurdu. Bu bir özelliğinde erse de bağlayıcı aracılığıyla kullanılabilir olacaktır

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

:

En

,

cevap

18

Çok gibi StaticExtension kullanarak daha iyi olurdu: Yerel sınıfın C# ad alanı için bir xmlns takma

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

. Daha fazla bilgi here bulunabilir.

Bağlama kullanma ile ilgili sorun, asla değişmeyecek bir şey için çok fazla yük ekliyorsunuz. Bağlanma mülkünüzü izleme girişiminde bulunacaktır. Ayrıca, INOTifyPropertyChanged uygulanmayan bir nesneye bağımlı olmayan özellikli bir Bağlama kullanarak known "leaks" vardır.

+0

Çok teşekkürler! Bu tam olarak istediğim şey!Ayrıca, sızıntı ve ek yük ile ilgili bilgiler gerçekten yararlıdır. – Aki24x

2

Sen (bir const tanımlanan) sabit döndüren bir özelliği, yani yapmak gerekir.

+0

Oh, doğru. Bunu daha kısa hale getirmenin bir yolu var mı? Yani, eğer C++ ise, makroyu yapmak için #define kullanabiliriz, ama yapamayız. IValueConverter ve Enum'un, ComboBox'a yeni Uid eklerken, tüm kodun bir hacmi açısından değil, bunu daha da kısaltacağını merak ediyorum. – Aki24x

+1

@ Aki24x: Bunu bir IValueConverter üzerinden yapabilir ve XAML'deki bir değeri sabit olarak (ciltleme yoluyla değil) belirtebilirsiniz. Bu, tek bir IValueConverter'ın bir şekilde bir arama yapmasına izin verir, ancak bakmak için bir şeye ihtiyacınız vardır, örneğin: bir sözlükte bir isim, veya bir numara kullanın veya ... –

+0

Anlıyorum. Sağol Reed. =) – Aki24x