2015-08-13 3 views
0

Мне нужно создать много элементов управления во время выполнения, и мне нужно привязать к массиву, но они не привязываются.wpf - Связывание свойств с кодом массива behing

В коде, мы можем предположить, что я получаю 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 
} 
+2

Почему на земле вы динамически создавать их вместо использования XAML? Вы делаете вещи * труднее, чем необходимо. – BradleyDotNET

+3

Я согласен с другим парнем. Почему вы создаете эти элементы управления на C#? Просто вставьте элемент ItemsControl в представление и установите его ItemsSource в свой массив, а затем укажите шаблон элемента. – SledgeHammer

+0

Покажите нам класс NameplateModel. – Brannon

ответ

0

я получил больше, чем я ожидал, Сначала я удалить весь код позади и гнал в Xaml на ItemsControl

Посмотреть

<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

Смежные вопросы