【问题标题】:Create ListViewItem based on ComboBox SelectedItem in MVVMMVVM中基于ComboBox SelectedItem创建ListViewItem
【发布时间】:2018-08-04 22:51:57
【问题描述】:

我有一个 StackPanel,其中包含一个 ComboBox 和几个其他控件,例如 LabelTextBox(未在下面的示例中显示)。

我想根据用户从ComboBox 中选择的项目,在StackPanel 的末尾添加几个其他控件。

示例: 如果我的ComboBox ItemSource 包括:Square、Rectangle、Circle 等。 然后在选择形状后,将显示正确的 ListViewItem,并且可以看到一组新控件,对于 Square,Label 将是“Side:” 对于 Circle,Label 将是“半径:”。


开始时:


用户选择 Square 后


用户选择圈子后

我不确定使用 ListViewItem 是否是正确的方法,如果是,如何实现(在 MVVM 中)。

谢谢。

编辑:
我有大约 16 个不同的行,因此我想避免创建每一行并将所有标签和文本框添加到每个选定的项目并使用项目的可见性。

任何帮助将不胜感激。

【问题讨论】:

    标签: wpf listview mvvm combobox selecteditem


    【解决方案1】:

    而不是动态添加控件。您可以在 xaml 中预定义所有控件,并且根据您的形状选择,可以更改此类控件的可见性以及您的标签内容。

    【讨论】:

    • 是的,我知道。我更喜欢使用更优雅的解决方案。
    【解决方案2】:

    您可以查看免费的“Xceed WPF Toolkit”中的 PropertyGrid 控件,该控件可通过 NuGet 获得。 (远离“香草”.Net PropertyGrid,因为它在 MVVM 方面存在一些问题)。

    PropertyGrid 呈现一个基于列表的 UI,该 UI 看起来非常类似于 Visual Studio“属性”窗口,允许用户编辑一个或多个(不同类型的)属性的值。

    我使用它已经有一段时间了,但您通常会为每个形状创建一个类,并带有相关属性,例如

    public class Square
    {
        [Category("Main")]
        [DisplayName("Side length")]
        public int Side {get; set;}
    }
    
    public class Circle
    {
        [Category("Main")]
        [DisplayName("Circle radius")]
        public int Radius {get; set;}
    }
    

    当您在组合框中选择一个项目时,您可以实例化相关类型的对象(Square、Circle)并将其分配给 VM 上的属性(确保实现 INotifyPropertyChanged 内容)。这可以是“对象”类型,也可以是一些通用接口。将此属性绑定到 PropertyGrid 控件的 SelectedObject 属性。

    您可以使用各种自定义属性来装饰您的类属性,以控制它们在属性网格控件中的外观,例如类别、显示名称、是否在网格中包含属性等。文档在他们的免费页面 (https://github.com/xceedsoftware/wpftoolkit/wiki/PropertyGrid) 上相当基本,但通过谷歌搜索,您可以从他们的“付费”版本中找到更详细的文档,例如https://xceed.com/wp-content/documentation/xceed-toolkit-plus-for-wpf/Xceed.Wpf.Toolkit~Xceed.Wpf.Toolkit.PropertyGrid.Attributes_namespace.html

    【讨论】:

      猜你喜欢
      • 2012-06-19
      • 2016-09-25
      • 2017-02-20
      • 2015-03-13
      • 2014-03-18
      • 1970-01-01
      • 2013-11-07
      • 1970-01-01
      • 2014-07-05
      相关资源
      最近更新 更多