none
Binding для программно создаваемого контрола RRS feed

  • Вопрос

  • Здравствуйте. Подскажите пожалуйста как можно сделать такое:

    Я хочу создать CustomControl с двумя  textbox. Потом на форме динамически по щелчку на определенной кнопке добавлять очередной CustomControl. Но у меня возникают затруднения . Как мне потом используя биндинг получать значения которыми были заполнены эти customControl ?

    1 октября 2014 г. 10:05

Ответы

  • Добрый день.

    Я бы верстал эту форму на основе ItemsControl. С биндингом к коллекции элементов поля из которых отображаются в ваших TextBox-ах. Т.е. ваш контрол будет указан в качестве DataTemplate.

    Если же вопрос как свойства Text ваших TextBox-ов прокинуть во вне, то можете посмотреть вот этот пример.

    1 октября 2014 г. 12:25
    Отвечающий

Все ответы

  • Добрый день.

    Я бы верстал эту форму на основе ItemsControl. С биндингом к коллекции элементов поля из которых отображаются в ваших TextBox-ах. Т.е. ваш контрол будет указан в качестве DataTemplate.

    Если же вопрос как свойства Text ваших TextBox-ов прокинуть во вне, то можете посмотреть вот этот пример.

    1 октября 2014 г. 12:25
    Отвечающий
  • хмм а это мысль, спасибо попробую:)
    1 октября 2014 г. 17:23
  • Ну раз всегда два TextBox'а статически, то просто добавляете в юзерконтрол два свойства

    public string Text
    {
                get { return (string)GetValue(TextProperty); }
                set { SetValue(TextProperty, value); }
    }
    
    public static readonly DependencyProperty TextProperty =
      DependencyProperty.Register("Text", typeof(string), typeof(CustomControl), new UIPropertyMetadata(null));

    И биндите их к модел, в которой их и заполняете.

    <UserControl.Resources>
      <Style TargetType="local:CustomControl">     
           <Setter Property="Text" Value="{Binding Path=DataContext.Model.Text, Mode=TwoWay}"/>  
      </Style>   
    </UserControl.Resources>



    1 октября 2014 г. 18:16
  • Я чтото запутался :( Мысль такая. Я Создаю ObservableCollection и биндю его к ListBox. В Item.Datatemplate хочу чтобы элементы отображались как TextBox. И у меня есть кнопка с прибиндиной к ней командой "Создать в коллекции новый элемент". Я хочу сделать так чтобы пользователь вводил какоето значение в текстбокс и это значение добавлялось в коллекцию. Нажали на кнопку -> появился новый пустой элемент , но поскольку он у нас отображается как textBox то в него потом сам пользователь может заполнить. Но у меня вылетает с эксепшеном что пустая коллеция. :(( Хотя я уже в ручную даже добавлял элементы туда.

    Делаю так

            <ListBox Grid.Row="0" ItemsSource="{Binding TenderInfo}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                        <Grid>
                            <Grid.ColumnDefinitions>
                                <ColumnDefinition Width="0.7*"></ColumnDefinition>
                                <ColumnDefinition Width="0.3*"></ColumnDefinition>
                            </Grid.ColumnDefinitions>
                            <TextBox Grid.Column="0"></TextBox>
                            <TextBox Grid.Column="1"></TextBox>
                        </Grid>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>
            <Button Grid.Row="1" Command="{Binding AddNewElementCommand}">Добавить</Button>
            <Grid Grid.Row="2">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.2*"></ColumnDefinition>
                    <ColumnDefinition Width="0.3*"></ColumnDefinition>
                    <ColumnDefinition Width="0.1*"></ColumnDefinition>
                    <ColumnDefinition Width="0.2*"></ColumnDefinition>
                </Grid.ColumnDefinitions>
                <Label Padding="2" Grid.Column="0">Время запуска программы</Label>
                <TextBox Grid.Column="1"></TextBox>
                <Label Padding="2" Grid.Column="3">:</Label>
                <TextBox Grid.Column="4"></TextBox>
            </Grid>
        </Grid>
    </UserControl>
    

    и вот моя ViewModel

    private bool CanAddElement()
            {
                //if (_tenderInfo != null)
                //    return true;
                //else return
                //    false;
                return true;
            }
    
            private void AddElement()
            {
                TenderInfo.Add(new InputUserData());
            }
    
            private ObservableCollection<InputUserData> _tenderInfo;
            public ObservableCollection<InputUserData> TenderInfo
            {
                get 
                {
                    _tenderInfo.Add(new InputUserData());
                    _tenderInfo.Add(new InputUserData());
                    return _tenderInfo; 
                }
                set
                {
                    _tenderInfo = value;
                    OnPropertyChanged(() => TenderInfo);
                }
            }
    
    



    2 октября 2014 г. 9:56
  • 1. А где вы вызываете конструктор для ObservableConnection?

    2. Коллега, а вы понимаете, как в вашем случае работает вот эта строка:

    TenderInfo.Add(new InputUserData());

    2 октября 2014 г. 9:59
    Отвечающий
  • 1)private ObservableCollection<InputUserData> _tenderInfo;
      public ObservableCollection<InputUserData> TenderInfo

    вот тут , только я думал что оно может заменить

    public ObservableCollection<InputUserData> TenderInfo = new

    public ObservableCollection<InputUserData> TenderInfo ()

    ??

    2) он создает новый объект

    InputUserData

    . Он же всеравно уже не null по идее равен ? . Я хотел потом конверторами уже преобразовывать введенные значения пользователем в InputUserData

    2 октября 2014 г. 10:05
  • аа блин точно спасибо всетаки новый объект он не создает тогда , только через new новый объект можно создать ,я просто часто видел как переменные просто описывают такого типа ,я почемуто всегда думал что это на подобии сокращенной записи new .
    2 октября 2014 г. 10:10
  • 2. Подумайте еще раз. Почему вы нажимаете на кнопку 1 раз а в табличку добавляются 3 записи?

    2 октября 2014 г. 10:16
    Отвечающий
  • не ну там то я понял почему, я в get убрал создания двух лишних объектов. Теперь там как нужно один новый текстбокс добавляется:)
    2 октября 2014 г. 10:44
  • Ок. Если решили свою проблему, не забудьте отметить ответ или ответы, которые помогли вам в решении проблемы.
    2 октября 2014 г. 10:45
    Отвечающий
  • Еще раз огромное  спасибо за помощь :)
    2 октября 2014 г. 10:49