从动态WPF表单中检索数据

时间:2015-10-23 14:20:04

标签: c# wpf mvvm data-binding data-entry

我的WPF表格有问题。

我有一个对象列表,这些对象具有Name,Value,IsRequired,Type(bool,string或Datepicker)的属性。

所以我的列表可以有任意数量的对象,它们可以是bool string等。

我创建了一个自定义控件,它通过此列表传​​播,并使用相关控件构建表单,如果它是bool,则构建CheckBox;如果是字符串,则构建TextBox。

到目前为止我必须生成的代码是这样的,我已将控件放在网格中进行布局。

 private object GetCustomElement(DicomMetadataModel metadata)
    {
        Grid dynamicGrid = new Grid() { VerticalAlignment = VerticalAlignment.Center };
        dynamicGrid.Background = new SolidColorBrush(Colors.Transparent);

        // Margin order LTRB
        dynamicGrid.Margin = new Thickness(10, 3, 10, 3);

        // Grid Definitions
        ColumnDefinition col1 = new ColumnDefinition();
        col1.Width = new GridLength(2, GridUnitType.Star);
        ColumnDefinition col2 = new ColumnDefinition();
        col2.Width = new GridLength(5, GridUnitType.Star);
        RowDefinition gridRow1 = new RowDefinition();
        gridRow1.Height = new GridLength(47);

        dynamicGrid.ColumnDefinitions.Add(col1);
        dynamicGrid.ColumnDefinitions.Add(col2);
        dynamicGrid.RowDefinitions.Add(gridRow1);

        //Label
        var label = new Label()
        {
            FontSize = 15,
            MinHeight = 12,
            VerticalContentAlignment = VerticalAlignment.Center,
            VerticalAlignment = VerticalAlignment.Center,
            Margin = new Thickness(0),
            Foreground = new SolidColorBrush(_lblTextColor)
        };
        label.Content = new TextBlock() { TextWrapping = TextWrapping.WrapWithOverflow, Text = metadata.Label };

        Grid.SetRow(label, 0);
        Grid.SetColumn(label, 0);
        dynamicGrid.Children.Add(label);

        if (metadata.Type == typeof(string) || metadata.Type == typeof(int))
        {
            //Textbox
            var textBox = new TextBox()
            {
                MinWidth = 150,
                MinHeight = 20,
                Padding = new Thickness(5),
                FontSize = 16,
                Foreground = new SolidColorBrush(_lblTextColor),
                BorderBrush = new SolidColorBrush(_tbBorderColor),
                Background = new SolidColorBrush(_tbBackgroundColor)
            };
            textBox.IsReadOnly = IsReadOnly;

            Grid.SetRow(textBox, 0);
            Grid.SetColumn(textBox, 1);

            dynamicGrid.Children.Add(textBox);

        }
        else if (metadata.Type == typeof(bool))
        {
            //RadioButton
            var stack = new WrapPanel();

            var view = new Viewbox() { MaxWidth = 30, Margin = new Thickness(10) };
            var radioButton = new RadioButton()
            {
                Background = new SolidColorBrush(_tbBackgroundColor),
                BorderBrush = new SolidColorBrush(_tbBorderColor),
                BorderThickness = new Thickness(1),
                Foreground = new SolidColorBrush((Color)ColorConverter.ConvertFromString("#FF7373"))
            };

            view.Child = radioButton;
            stack.Children.Add((UIElement)view);

            Grid.SetRow(stack, 0);
            Grid.SetColumn(stack, 1);

            dynamicGrid.Children.Add(stack);
        }

        return dynamicGrid;
    }

此代码用于创建每个元素,这是在以下方法中递归调用的

private void LoadViewerStudyInformation()
    {

        var dicomMetadata = DataContext as List<DicomMetadataModel>;
        if (dicomMetadata == null)
        {
            throw new InvalidOperationException();
        }

        int count = 0;

        foreach (var metadata in dicomMetadata)
        {
            if (!metadata.IsVisible)
            {
                continue;
            }
            else if(count < 5)
            {
                Children.Add((UIElement)GetCustomElement(metadata));                    
                count++;
            }
            Margin = new Thickness(10);
            Orientation = Orientation.Vertical;
        }

        // TODO build control, bind field to DataContext models
       // TODO how result of control is bound to DataContext model Result property
    }

这会创建我希望它出现在屏幕上的表单。

我现在遇到了麻烦,但是将所输入的数据挂钩并将其绑定到某个模型以存储信息。

我可以连接文本框TextChanged事件,但是当它被触发时,没有迹象表明它应该存储什么属性。

我是否需要创建一个新类,假设其中可能包含textbox和label属性,并调用它,myClass.Textbox.Text等。

MetaDataDicomModel就像这样

public class DicomMetadataModel
{
    public string Value { get; set; }

    public string Label { get; set; }

    public Type Type { get; set; }

    public bool IsRequired { get; set; }

    public bool IsVisible { get; set; }

    public bool IsReadOnly { get; set; }
}

由于缺乏理解,我不想制造过于复杂的东西,如果有人能提出最好的方法,我将非常感激。

0 个答案:

没有答案