我的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; }
}
由于缺乏理解,我不想制造过于复杂的东西,如果有人能提出最好的方法,我将非常感激。