Как я могу связать ObservableCollection с TextBoxes в DataTemplate?

Если ваш текстовый редактор не выполняет хорошее завершение кода, вы напрасно тратите время.

Быстрое запоминание тысяч списков аргументов, написания и возвращаемых значений (не говоря уже о классовых структурах и аналогичных сложных организационных моделях) - это задача, на которой компьютеры хороши, а люди (сравнительно) - нет. Я искренне согласен с тем, что немного замедлить себя и избежать культа гаджетов и функций - это отличный способ повысить эффективность и избежать ошибок, но просто бесполезно тратить 30 секунд на излишнюю охоту по исходному коду или документам, когда вы можете потратить ноль .. особенно если вам просто нужно написание (что чаще, чем нам хотелось бы признать).

Конечно, если нет редактора, который предоставляет эту функциональность для вашего языка, или задача достаточно проста для выполнения за время, необходимое для загрузки более тяжелого редактора, никто не скажет вам, что Eclipse и 90 плагинов это правильный инструмент. Но, пожалуйста, не говорите мне, что способность HJKL обходить вас, как будто это 1999 год, действительно экономит вам больше времени, чем запускать escape каждый раз, когда вам нужна сигнатура метода ... даже если вы чувствуете себя менее "хакерским", делая это.

Мысли?

9
задан Vadim Kotov 8 August 2017 в 13:36
поделиться

2 ответа

Вам нужно свойство для двусторонней привязки, поэтому строка для этого не подходит.

Оберните его в строковый объект, например:

public class Model
{
    public ObservableCollection<StringObject> List { get; private set; }
    public Model()
    {
        List = new ObservableCollection<StringObject>
                   {
                       new StringObject {Value = "why"},
                       new StringObject {Value = "not"},
                       new StringObject {Value = "these"},
                   };
    }
}

public class StringObject
{
    public string Value { get; set; }
}

и привяжите к свойству Value вместо "."

Кроме того, вам не нужно уведомлять об изменении наблюдаемой коллекции, поэтому, пока ваша модель не будет какое-то другое собственное свойство, оно не обязательно должно иметь INotifyPropertyChange. Если вы хотите, чтобы ItemsControl реагировал на изменения в отдельных объектах StringObject, вам следует добавить INotifyPropertyChanged к StringObject.

И, опять же, двусторонняя привязка используется по умолчанию, поэтому вам нужно только

<TextBox Text="{Binding Path=Value}" />

в вашей привязке.

12
ответ дан 4 December 2019 в 15:24
поделиться

Я считаю, что вам необходимо получить элементы коллекции из DependencyObject для работы привязки TwoWay. Что-то вроде:

public class DependencyString: DependencyObject {
    public string Value {
        get { return (string)GetValue(ValueProperty); }
        set { SetValue(ValueProperty, value); }
    }

    public static readonly DependencyProperty ValueProperty =
        DependencyProperty.Register("Value", typeof(string), typeof(DependencyString), new UIPropertyMetadata(""));

    public override string ToString() {
        return Value;
    }

    public DependencyString(string s) {
        this.Value = s;
    }
}

public class Model {
    private ObservableCollection<DependencyString> _list = new ObservableCollection<DependencyString>();
    public ObservableCollection<DependencyString> List {
        get { return _list; }
    }

    public Model() { 
        List.Add(new DependencyString("why")); 
        List.Add(new DependencyString("not"));
        List.Add(new DependencyString("these?"));
    }
}

...

<StackPanel x:Name="theGrid">
    <GroupBox BorderBrush="LightGreen">
        <GroupBox.Header>
            <TextBlock Text="Group" />        
        </GroupBox.Header>
        <ItemsControl ItemsSource="{Binding Path=List}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <TextBox Text="{Binding Path=Value, Mode=TwoWay}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
        </ItemsControl>
    </GroupBox>
</StackPanel>
1
ответ дан 4 December 2019 в 15:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: