Какой самый простой способ отобразить свойства модели в виде метки и текстового поля? - PullRequest
0 голосов
/ 12 февраля 2019

Я использую шаблон 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 свойств, и, возможно, есть более простой способ вместо изменения пользовательского интерфейса, если свойство добавлено или изменено.

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Вы можете использовать элемент управления 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>
0 голосов
/ 13 февраля 2019

Вы можете попробовать этот элемент управления detailsview.https://archive.codeplex.com/?p=wpfdetailsview

0 голосов
/ 12 февраля 2019

Использовать отражение:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...