WPF ItemsControl und SelectedItem.
-
Noch eine Frage. Und zwar habe ich ein ItemsControl, dass Radiobuttons enthält. Nun würde ich gerne über Binding einen Radiobutton auswählen. Weiß aber nicht wie ich das realisieren soll.
Hier mal mein XAML Code:
Das SelectedItem ist natürlich falsch. Es soll nur zeigen woran ich das ganze Binden will.
<ItemsControl ItemsSource="{Binding SubList}" SelectedItem="{Binding Path=Sublist.ActiveComponent}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <WrapPanel /> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <RadioButton Content="{Binding Path=Model.Name}" GroupName="Stations" Style="{StaticResource radioButtonStation}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl>
Vieleicht irgendjamand eine Idee
-
Warum nimmst Du in dem Fall keine ListBox, da wäre es einfacher?
-
@GoaZwerg
Seinen alten Beiträgen nach ist sein DataTemplate etwas komplexer aufgebaut und er wird vermutlich nur ein Dummy als Beispiel hier zeigen.@sausebrause
Du brauchst eigentlich nur ein Property in deinem item ViewModel wogegen du Binden kannst.
Der Rest erklärt sich dann durch den Beispielcode selber (nur in UltraEdit getippt).public class Item : ObervableObject { public string Name { get { return _name; } set { _name = value; NotifyPropertyChanged(() => Name); } } private string _name; public bool IsChecked { get { return _isChecked; } set { _isChecked = value; NotifyPropertyChanged(() => IsChecked); } } private bool _isChecked; }
public class MainViewModel : ObervableObject { public ObservableCollection<Item> Items { get; set; } public MainViewModel() { Items = new ObservableCollection<Item>(); var item = new Item { Name = "Demo" }; Items.Add(item); } public void CheckItemByName(string name) { var item = Items.FirstOrDefault(i => i.Name == name); if (item != null) item.IsChecked = true; } }
<Window...> <ItemsControl ItemsSource="{Binding Items}"> <ItemsControl.ItemTemplate> <DataTemplate> <RadioButton Content="{Binding Name}" IsChecked="{Binding IsChecked}" /> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> </Window>
-
Was mir noch gerade auffällt. Du machst manchmal
"Binding Path=Name"
und manchmal nur
"Binding Name".
Das ist beides das selbe.
Die BindingMarkupExtension hat einen Leeren Konstruktor, und einen der den path annimmtpublic class BindingMarkupExtension : MarkupExtension { public BindingMarkupExtension(){...} public BindingMarkupExtension(string path) { Path = path; } }
Wenn du nun sagst
"Binding Path=Name"
wird erst der leere Konstruktor aufgerufen, und dann durch Path=Name das Property gesetzt.
Bei"Binding Name"
wird direkt der Konstruktor mit dem Path verwendet.
Bleib am ende Konsistent und lass Path weg wenn möglich, bei StaticResource machst du es ja auch über den Konstruktor.
-
Etwas OT: mit dem NotifyPropertyChanged-Event mache ich das auch immer, habe aber neulich gelesen das die DependencyProperties wesentlich schneller arbeiten sollen.
-
DependencyProperties finde ich in ViewModels fehl am platz. Die sind eher was für CustomControls.
Gerade mal geschaut,es heißt
MSDN schrieb:
In general, accessing a dependency property of a DependencyObject is not slower than accessing a CLR property. While there is a small performance overhead for setting a property value, getting a value is as fast as getting the value from a CLR property.
Quelle: http://msdn.microsoft.com/en-us/library/bb613565.aspx
Etwas mehr steht hier:
http://stackoverflow.com/questions/570684/inotifypropertychanged-vs-dependencyproperty
Da steht auch ein gemessener Geschwindigkeitsvorteil für die DPs.Ich bleibe aber lieber bei den INotify. DP = Custom Control; Notify = ViewModels.
Bzgl MVVM ist das hier interessant:
http://stackoverflow.com/questions/291518/inotifypropertychanged-vs-dependencyproperty-in-viewmodel
Da werden Punkte aufgeführt warum man in ViewModels eher das Notify verwenden sollte.
-
Das ist sehr interessant, herzlichen Dank für Deinen Beitrag
.
Wieder etwas gelernt