Frage

Gibt es eine gute Möglichkeit zum binden einer Eigenschaft auf einen const-Wert im codebehind?

Wenn ich ComboBox, ich in der Regel nicht auf diese Weise in xaml und 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;
}

Der Grund, warum ich wählte diese Weise ist folgende:

  • Für die Lokalisierung Zweck, Inhalt Zeichenfolge sollte nicht verwendet werden, um zu bestimmen, welches Element ausgewählt ist beim speichern und laden einer zuletzt ausgewählte Element.
  • Für Einfachheit, XAML und code-behind angeschlossen werden sollte interner Bezeichner (In diesem Fall, Uid).So dass, XAML und Code-behind kann getrennt verwaltet.

Jedoch, die Wartung und Weise, die internen Bezeichner definiert werden sollte, in einem Ort wie diesem:

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

...

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

Das problem ist scheinbar Eigenschaft nicht const-Wert, so gibt es keine Möglichkeit zum binden ID_foo und ID_bar die Uid der ComboBoxItem wie diese:

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

Also, ich möchte wissen, wie dieses Problem zu lösen.Oder gibt es eine bessere Möglichkeit, es zu implementieren.Es wäre auch schön.

Best,

War es hilfreich?

Lösung

Sie wären besser dran mit dem StaticExtension, wie so:

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

Wo local ist ein xmlns-alias für die C# - namespace der Klasse.Mehr Informationen können gefunden werden hier.

Das problem mit der Bindung, die Sie hinzufügen eine Menge Aufwand für etwas, dass wird sich nie ändern.Die Bindung wird versuchen, Ihre Immobilie zu überwachen.Außerdem gibt es bekannt "Lecks" mit der Verwendung einer Bindung mit einer nicht-dependency-Eigenschaft auf ein Objekt, das nicht implementieren INotifyPropertyChanged.

Andere Tipps

Sie müssen eine Eigenschaft erstellen, die die Konstante zurückgibt (definiert in einem Const), dh:

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

Sobald dies in einer Eigenschaft ist, kann es durch Bindung verwendet werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top