将模型的属性显示为标签和文本框的最简单方法是什么?

时间:2019-02-12 20:00:20

标签: c# wpf

我正在将MVVM模式与WPF一起使用,并且确实希望在视图的标签和文本框列表中显示模型中的所有属性。因此,属性的名称应在标签中,并且属性的值应具有“绑定到文本框”。 (请参见下图)

Labels and Textboxes

此示例中的模型具有以下属性:(当然带有PropertyChanged)

public class HoseData
{
    public string Article {get; set;} = "6931313"
    public string Description {get; set;} = ""
    public string Type {get; set;} = "DKC"
}

直到现在,我的观点仍然如此:

<StackPanel>
    <StackPanel Orientation="Horizontal">
        <Label Content="Article" />
        <TextBox Text="{Binding Article}" />
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <Label Content="Description" />
        <TextBox Text="{Binding Description}" />
    </StackPanel>
    <StackPanel Orientation="Horizontal">
        <Label Content="Type" />
        <TextBox Text="{Binding Type}" />
    </StackPanel>
</StackPanel>

是否有一种简便的方法可以从模型中获取这种视图?就我而言,模型具有30个属性,如果添加或更改了属性,也许有一种更简便的方法来代替UI。

3 个答案:

答案 0 :(得分:0)

使用反射:

var hd = new HoseData();

...

PropertyInfo[] properties = typeof(HoseData).GetProperties();
foreach (PropertyInfo pi in properties)
{
    var name = pi.Name;
    var value = pi.GetValue(hd);
    var label = new Label()
    {
        Content = name
    };
    var textbox = new TextBox()
    {
        Text = value.ToString(),
    };
    var binding = new Binding(name)
    {
        Source = hd,
        Mode = BindingMode.TwoWay,
        UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged
    };
    textbox.SetBinding(TextBox.TextProperty, binding);
    var stackpanel = new StackPanel()
    {
        Orientation = Orientation.Horizontal
    };
    stackpanel.Children.Add(label);
    stackpanel.Children.Add(textbox);
    sp.Children.Add(yourMainStackPanel);
}

答案 1 :(得分:0)

您可以使用PropertyGrid中的Extended WPF Toolkit控件:

xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
...
<xctk:PropertyGrid ShowSearchBox="False" ShowTitle="False" ShowSummary="False" ShowAdvancedOptions="False"
                   ShowSortOptions="False">
    <xctk:PropertyGrid.SelectedObject>
        <local:HoseData />
    </xctk:PropertyGrid.SelectedObject>
</xctk:PropertyGrid>

答案 2 :(得分:0)

您可以尝试使用此detailsview控件。 https://archive.codeplex.com/?p=wpfdetailsview