基于MVVM中的ComboBox SelectedItem创建ListViewItem

时间:2018-02-25 10:02:47

标签: wpf listview mvvm combobox selecteditem

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

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

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


开始时:
enter image description here


用户选择Square后
enter image description here


用户选择Circle后
enter image description here

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

感谢。

修改
我有大约16个不同的行,因此创建每一行并将所有标签和文本框添加到每个选定的项目中并使用项目的可见性进行播放是我想要避免的。

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

你可以通过NuGet获得免费的“Xceed WPF Toolkit”中的PropertyGrid控件。 (远离“vanilla”.Net PropertyGrid,因为它与MVVM有一些问题)。

PropertyGrid呈现一个基于列表的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内容)。这可以是'object'类型,也可以是一些常见的接口。您将此属性绑定到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