我正在将MVVM模式与WPF一起使用,并且确实希望在视图的标签和文本框列表中显示模型中的所有属性。因此,属性的名称应在标签中,并且属性的值应具有“绑定到文本框”。 (请参见下图)
此示例中的模型具有以下属性:(当然带有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。
答案 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