WPF MVVM Optionsfelder auf ItemsControl
Habe ich gebunden enums des radio-buttons vor, und ich in der Regel verstehen, wie es funktioniert. Ich benutzte die Alternative Implementierung aus dieser Frage: Wie binden RadioButtons zu enum?
Statt Aufzählungen, würde ich gerne erzeugen einen Laufzeit-aufgezählt festlegen eines benutzerdefinierten Typs und präsentieren diese als Gruppe von radio-buttons. Ich habe eine view, die gegen eine Laufzeit-aufgezählt mit einem ListView
die Bindung an den ItemsSource
und SelectedItem
Eigenschaften, so meine ViewModel
richtig angeschlossen ist. Jetzt versuche ich, den Wechsel von einer ListView
zu einem ItemsControl
mit radio-buttons.
Hier ist so weit, wie ich bekommen habe:
<Window.Resources>
<vm:InstanceToBooleanConverter x:Key="InstanceToBooleanConverter" />
</Window.Resources>
<!-- ... -->
<ItemsControl ItemsSource="{Binding ItemSelections}">
<ItemsControl.ItemTemplate>
<DataTemplate DataType="{x:Type vm:ISomeType}">
<RadioButton Content="{Binding Name}"
IsChecked="{Binding Path=SelectedItem, Converter={StaticResource InstanceToBooleanConverter}, ConverterParameter={Binding}}"
Grid.Column="0" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
InstanceToBooleanConverter
hat die gleiche Umsetzung wie EnumToBooleanConverter
aus, die andere Frage. Dies scheint in Ordnung, da es wie es scheint, nur startet das Equals
Methode:
public class InstanceToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(true) ? parameter : Binding.DoNothing;
}
}
Das problem, das ich erhalte ist jetzt, dass ich kann nicht herausfinden, wie das senden einer Laufzeit Wert als die ConverterParameter
. Wenn ich versuche (mit dem code oben), bekomme ich diesen Fehler:
'Verbindlich' wurde nicht gesetzt auf 'ConverterParameter' - Eigenschaft mit dem Typ "Verbindlich". Eine 'Bindung' kann nur gesetzt werden, auf eine DependencyProperty eines DependencyObject.
Gibt es eine Möglichkeit, zu binden, um die Element-Instanz, und übergeben es an die IValueConverter
?
InformationsquelleAutor der Frage Merlyn Morgan-Graham | 2011-05-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es stellt sich heraus, dass es ist viel einfacher aufzugeben, mit
ItemsControl
und stattdessen gehen mitListBox
.Kann es mehr schwere, aber vor allem, weil es ist zu tun, die schweres heben für Sie. Es ist wirklich einfach zu tun, eine zwei-Wege-Datenbindung zwischen
RadioButton.IsChecked
undListBoxItem.IsSelected
. Mit der richtigen Steuerung Vorlage für dieListBoxItem
Sie können leicht loszuwerden, alle die Auswahl visual.InformationsquelleAutor der Antwort Merlyn Morgan-Graham
Soweit ich weiß, gibt es keine gute Möglichkeit, dies zu tun mit
MultiBinding
obwohl Sie zunächst denken, es wäre. Da kann man nicht binden, dieConverterParameter
IhreConvertBack
Umsetzung nicht über die Informationen, die es braucht.Was ich gemacht habe, ist eine separate
EnumModel
Klasse, die ausschließlich für den Zweck der Bindung einer enum-radio-buttons. Einen Konverter verwenden, die auf dieItemsSource
Eigenschaft und dann bist du verbindlich zu einerEnumModel
. DieEnumModel
ist nur eine Weiterleitung Objekt, um Bindung möglich. Es hält einen möglichen Wert des enum und eine Referenz auf das viewmodel so kann es übersetzen eine Eigenschaft im viewmodel, und vom Typ boolean.Hier ist eine ungetestete, aber generischen version:
Den Konverter:
Den EnumModel:
Für ein code-Beispiel, das ich kenne funktioniert (aber es ist immer noch Recht ungeschliffen - WIP!), Sie können sehen,http://code.google.com/p/pdx/source/browse/trunk/PDX/PDX/Toolkit/EnumControl.xaml.cs. Dies funktioniert nur im Rahmen meiner Bibliothek, aber es zeigt die Einstellung der Name der EnumModel auf der Grundlage der
DescriptionAttribute
die möglicherweise nützlich für Sie sein.InformationsquelleAutor der Antwort default.kramer
Bist du so nah. Wenn Sie brauchen, sind zwei Bindungen für einen Konverter benötigen Sie eine
MultiBinding
und einIMultiValueConverter
! Die syntax ist ein wenig Ausführlicher, aber nicht mehr schwierig.Edit:
Hier ist ein wenig code, um Ihnen den Einstieg.
Der Bindung:
dem Konverter:
Zweiter Edit:
Dem obigen Ansatz ist nicht sinnvoll, die Implementierung von zwei-Wege-Bindung mit der Technik verknüpft ist die Frage, weil die erforderlichen Informationen sind nicht verfügbar, wenn der Konvertierung zurück.
Die richtige Lösung, die ich glaube, ist gerade MVVM: code des view-Modells an den Bedürfnissen der Ansicht. Die Menge an code ist sehr klein und entfällt die Notwendigkeit für einen Konverter oder lustige Bindungen oder tricks.
Hier ist der XAML;
- und code-behind zu simulieren, das view-Modell:
und einige view-Modell Infrastruktur:
InformationsquelleAutor der Antwort Rick Sladkey
Nun, ich weiß, über das x:Shared (Dank Ihrer andere Frage), ich verzichte auf meine Vorherige Antwort und sagen, dass ein
MultiBinding
ist der Weg zu gehen, nachdem alle.XAML:
Viewmodel:
Den Konverter:
InformationsquelleAutor der Antwort default.kramer