将属性绑定到数组代码后面
本文关键字:代码 数组 属性 绑定 | 更新日期: 2023-09-27 18:07:47
我必须在运行时创建许多控件,我需要绑定到一个数组,但它们不绑定。
在代码中,我们可以假设我得到3个铭牌,但是当我输入数据或选择一个项目时,它们不会在属性
中设置它视图Grid grid = new Grid();
int top = 10;
int position = 0;
foreach (NameplateModel nameplate in _nameplateList)
{
Label lbl = new Label();
lbl.Content = nameplate.FieldName;
lbl.HorizontalAlignment = HorizontalAlignment.Left;
lbl.VerticalAlignment = VerticalAlignment.Top;
lbl.Margin = new Thickness(0, top, 0, 0);
grid.Children.Add(lbl);
if (nameplate.LookupValue !=null && nameplate.LookupValue.Count() > 0)
{
ComboBox cbo = new ComboBox();
cbo.ItemsSource = nameplate.LookupValue;
Binding b = new Binding();
b.Source = DataContext;
b.Path = new PropertyPath("TextValues[0]");
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
b.Mode = BindingMode.TwoWay;
cbo.SetBinding(ComboBox.TextProperty,b);
if (!nameplate.LimitToList)
{
cbo.IsEditable = true;
}
cbo.HorizontalAlignment = HorizontalAlignment.Left;
cbo.Margin = new Thickness(98,top,0,0);
cbo.Width = 174;
cbo.VerticalAlignment = VerticalAlignment.Top;
grid.Children.Add(cbo);
}
else
{
TextBox txt = new TextBox();
Binding b = new Binding();
b.Source = DataContext;
b.Path = new PropertyPath(string.Format("TextValues[{0}]", position));
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
b.Mode = BindingMode.TwoWay;
txt.SetBinding(TextBox.TextProperty, b);
txt.HorizontalAlignment = HorizontalAlignment.Left;
txt.VerticalAlignment = VerticalAlignment.Top;
txt.Width = 174;
txt.Margin = new Thickness(98, top, 0, 0);
grid.Children.Add(txt);
}
top = top + 29;
position++;
}
scvNameplate.Content = grid;
和我的ViewModel
public string[] TextValues
{
get
{
return _textValues ?? (_textValues = new string[3]);
}
set
{
_textValues = value;
OnPropertyChanged("TextValues");
}
}
NameplateModel
public class NameplateModel
{
#region Fields
string _fieldName;
string _lookupCode;
string[] _lookupValue;
bool _limitToList;
#endregion
#region Properties
public string FieldName
{
get
{
return _fieldName;
}
set
{
_fieldName = value;
}
}
public string LookupCode
{
get
{
return _lookupCode;
}
set
{
_lookupCode = value;
}
}
public string[] LookupValue
{
get
{
return _lookupValue;
}
set
{
_lookupValue = value;
}
}
public bool LimitToList
{
get
{
return _limitToList;
}
set
{
_limitToList = value;
}
}
#endregion
}
我得到了比我预期的更多,首先我删除了后面的所有代码,并在ItemsControl
上添加了Xaml。视图 <ItemsControl ItemsSource="{Binding NameplateList}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="100" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Label Content="{Binding FieldName}" Margin="0,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.Row="0" Grid.Column="0"/>
<ComboBox Text="{Binding TextValue, UpdateSourceTrigger=PropertyChanged}" ItemsSource="{Binding LookupValue}" IsEditable="{Binding LimitToList}" Margin="0,0,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="174" Grid.Row="0" Grid.Column="1" Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<TextBox Text="{Binding TextValue}" HorizontalAlignment="Left" VerticalAlignment="Top" Width="174" Margin="0,0,0,0" Visibility="{Binding IsVisibleText, Converter={StaticResource BooleanToVisibilityConverter}}" Grid.Row="0" Grid.Column="1"/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
,然后只需要添加字符串TextValue属性采取的值,我需要进入NameplateModel,而不是有一个TextValue[]在viewModel
现在它工作完美,感谢@BradleyDotNET