WPF MVVM层次结构选择项

编程入门 行业动态 更新时间:2024-10-26 14:36:33
本文介绍了WPF MVVM层次结构选择项的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我当前正在使用ListBoxes实现显示层次结构的应用程序(请不要建议使用TreeView,需要使用ListBoxes).

在以下文章中看起来像> WPF的CollectionViewSource(带有源代码).

课程:

public class Mountains : ObservableCollection<Mountain> { public ObservableCollection<Lift> Lifts { get; } public string Name { get; } } public class Lift { public ObservableCollection<string> Runs { get; } }

该示例使用CollectionViewSource实例(请参阅XAML)来简化设计. Mountains类的实例是窗口的DataContext.

问题是:我希望Mountains类具有SelectedRun属性,并且应该将其设置为当前选择的运行.

public class Mountains : ObservableCollection<Mountain> { public ObservableCollection<Lift> Lifts { get; } public string Name { get; } public string SelectedRun { get; set; } }

也许我错过了一些基本原理,但是我该如何实现呢?

解决方案

您可能想阅读有关在绑定中使用'/'的信息.请参见此 MSDN文章中的当前项目指针"部分.. >

这是我的解决方法:

Xaml

<Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Margin="5" Grid.Row="0" Grid.Column="0" Text="Mountains"/> <TextBlock Margin="5" Grid.Row="0" Grid.Column="1" Text="Lifts"/> <TextBlock Margin="5" Grid.Row="0" Grid.Column="2" Text="Runs"/> <ListBox Grid.Row="1" Grid.Column="0" Margin="5" ItemsSource="{Binding Mountains}" DisplayMemberPath="Name" IsSynchronizedWithCurrentItem="True" /> <ListBox Grid.Row="1" Grid.Column="1" Margin="5" ItemsSource="{Binding Mountains/Lifts}" DisplayMemberPath="Name" IsSynchronizedWithCurrentItem="True"/> <ListBox Grid.Row="1" Grid.Column="2" Margin="5" ItemsSource="{Binding Mountains/Lifts/Runs}" IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding SelectedRun}"/> </Grid>

C#(请注意,除非将更改属性,而不仅仅是选择属性,否则您无需实现INotifyPropertyChanged)

public class MountainsViewModel { public MountainsViewModel() { Mountains = new ObservableCollection<Mountain> { new Mountain { Name = "Whistler", Lifts = new ObservableCollection<Lift> { new Lift { Name = "Big Red", Runs = new ObservableCollection<string> { "Headwall", "Fisheye", "Jimmy's" } }, new Lift { Name = "Garbanzo", Runs = new ObservableCollection<string> { "Headwall1", "Fisheye1", "Jimmy's1" } }, new Lift {Name = "Orange"}, } }, new Mountain { Name = "Stevens", Lifts = new ObservableCollection<Lift> { new Lift {Name = "One"}, new Lift {Name = "Two"}, new Lift {Name = "Three"}, } }, new Mountain {Name = "Crystal"}, }; } public string Name { get; set; } private string _selectedRun; public string SelectedRun { get { return _selectedRun; } set { Debug.WriteLine(value); _selectedRun = value; } } public ObservableCollection<Mountain> Mountains { get; set; } } public class Mountain { public string Name { get; set; } public ObservableCollection<Lift> Lifts { get; set; } } public class Lift { public string Name { get; set; } public ObservableCollection<string> Runs { get; set; } }

I am currently implementing the application that displays hierarchy using ListBoxes (please do not suggest using TreeView, ListBoxes are needed).

It looks like that in the article: WPF’s CollectionViewSource (with source code).

Classes:

public class Mountains : ObservableCollection<Mountain> { public ObservableCollection<Lift> Lifts { get; } public string Name { get; } } public class Lift { public ObservableCollection<string> Runs { get; } }

The example uses CollectionViewSource instances (see XAML) to simplify the design. An instance of Mountains class is the DataContext for the window.

The problem is: I would like that the Mountains class to have SelectedRun property and it should be set to currently selected run.

public class Mountains : ObservableCollection<Mountain> { public ObservableCollection<Lift> Lifts { get; } public string Name { get; } public string SelectedRun { get; set; } }

Maybe I've missed something basic principle, but how can I achieve this?

解决方案

You may want to read about the use of '/' in bindings. See the section 'current item pointers' on this MSDN article.

Here's my solution:

Xaml

<Grid.RowDefinitions> <RowDefinition Height="Auto"/> <RowDefinition/> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition/> <ColumnDefinition/> <ColumnDefinition/> </Grid.ColumnDefinitions> <TextBlock Margin="5" Grid.Row="0" Grid.Column="0" Text="Mountains"/> <TextBlock Margin="5" Grid.Row="0" Grid.Column="1" Text="Lifts"/> <TextBlock Margin="5" Grid.Row="0" Grid.Column="2" Text="Runs"/> <ListBox Grid.Row="1" Grid.Column="0" Margin="5" ItemsSource="{Binding Mountains}" DisplayMemberPath="Name" IsSynchronizedWithCurrentItem="True" /> <ListBox Grid.Row="1" Grid.Column="1" Margin="5" ItemsSource="{Binding Mountains/Lifts}" DisplayMemberPath="Name" IsSynchronizedWithCurrentItem="True"/> <ListBox Grid.Row="1" Grid.Column="2" Margin="5" ItemsSource="{Binding Mountains/Lifts/Runs}" IsSynchronizedWithCurrentItem="True" SelectedItem="{Binding SelectedRun}"/> </Grid>

C# (note, you don't need to implement INotifyPropertyChanged unless the properties will be changed and not just selected)

public class MountainsViewModel { public MountainsViewModel() { Mountains = new ObservableCollection<Mountain> { new Mountain { Name = "Whistler", Lifts = new ObservableCollection<Lift> { new Lift { Name = "Big Red", Runs = new ObservableCollection<string> { "Headwall", "Fisheye", "Jimmy's" } }, new Lift { Name = "Garbanzo", Runs = new ObservableCollection<string> { "Headwall1", "Fisheye1", "Jimmy's1" } }, new Lift {Name = "Orange"}, } }, new Mountain { Name = "Stevens", Lifts = new ObservableCollection<Lift> { new Lift {Name = "One"}, new Lift {Name = "Two"}, new Lift {Name = "Three"}, } }, new Mountain {Name = "Crystal"}, }; } public string Name { get; set; } private string _selectedRun; public string SelectedRun { get { return _selectedRun; } set { Debug.WriteLine(value); _selectedRun = value; } } public ObservableCollection<Mountain> Mountains { get; set; } } public class Mountain { public string Name { get; set; } public ObservableCollection<Lift> Lifts { get; set; } } public class Lift { public string Name { get; set; } public ObservableCollection<string> Runs { get; set; } }

更多推荐

WPF MVVM层次结构选择项

本文发布于:2023-07-19 07:17:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1154178.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:层次   结构   WPF   MVVM

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!