将属性绑定到数组代码后面

本文关键字:代码 数组 属性 绑定 | 更新日期: 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