Is there any good way to bind a property to a const value in codebehind?
When I use ComboBox, I usually do this way in xaml and code behind:
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;
}
The reason why I chose this way is following:
However, maintenance-wise, the internal identifier should be defined in one-place like this:
//IDs
public const string ID_foo = "foo";
public const string ID_bar = "bar";
...
//
switch (item.Uid)
{
case ID_foo: ... break;
case ID_bar: ... break;
}
The problem is seemingly property cannot be const value, so there's no way to bind ID_foo and ID_bar to Uid of ComboBoxItem like this:
//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>
So, I want to know how to solve this issue. Or, is there any better way to implement it. It would be nice, too.
Best,
You would be better off using the StaticExtension, like so:
Uid="{x:Static local:YourClass.ID_foo}"
Where local is an xmlns alias for the C# namespace of your class. More information can be found here.
The problem with using Binding is you are adding a lot overhead for something that will never change. The binding will attempt to monitor your property. Also, there are known "leaks" with using a Binding with a non-dependency property on an object that don't implement INotifyPropertyChanged.
You need to make a property that returns the constant (defined in a const), ie:
private const string ID_Foo = "foo";
public string FooId
{
get { return ID_Foo; }
}
Once this is in a property, it will be usable via binding.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With