Подтвердить что ты не робот

Двусторонняя привязка в WPF

Я не могу получить двухстороннюю привязку в WPF для работы. У меня есть свойство string в главном окне приложения, которое связано с текстовым полем (я установил режим "TwoWay" ). Единственный момент, когда значение текстового поля будет обновляться, - это когда инициализируется окно. Когда я ввожу текст в текстовое поле, значение свойства строковой строки не изменяется. Когда значение свойства строки изменяется внешним источником (например, событие Click, которое просто сбрасывает значение текстового поля), это изменение не распространяется до текстового поля.

Каковы шаги, которые я должен реализовать, чтобы получить двустороннюю привязку для правильной работы даже в этом почти тривиальном примере?

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

4b9b3361

Ответ 1

Скорее всего, вы пытаетесь привязываться к свойству .net CLR, а не к переменной зависимости WPF (которая предоставляет уведомление об изменении в дополнение к некоторым другим вещам).
Для обычного свойства CLR вам необходимо реализовать INotifyPropertyChanged и принудительное обновление в текстовом поле в обработчике событий для PropertyChanged.

  • Итак, сделайте свой объект с помощью свойства, реализующего этот интерфейс, поднимите событие в настройщике свойств. (Итак, теперь у нас есть уведомление об изменении свойства)
  • Убедитесь, что объект задан как свойство DataContext элемента/элемента интерфейса пользователя

Это тоже отбросило меня, когда я начал изучать привязку данных WPF.

Обновление: Хорошо, это была бы пустая трата времени, если бы я лаял неправильное дерево.. так или иначе, так как вам нужно было немного копать.. вы запомните это для долго. Здесь фрагмент кода, чтобы завершить этот ответ. Также выяснилось, что обновление текстового поля происходит автоматически, как только я выложу. Вам нужно только вручную подписаться на событие и обновить интерфейс, если ваш объект datacontext не тот, который реализует INotifyPropertyChanged.

MyWindow.xaml

<Window x:Class="DataBinding.MyWindow" ...
    Title="MyWindow" Height="300" Width="300">
    <StackPanel x:Name="TopLevelContainer">
        <TextBox x:Name="txtValue"  Background="AliceBlue" Text="{Binding Path=MyDotNetProperty}" />
        <TextBlock TextWrapping="Wrap">We're twin blue boxes bound to the same property.</TextBlock>
        <TextBox x:Name="txtValue2"  Background="AliceBlue" Text="{Binding Path=MyDotNetProperty}" />
    </StackPanel>
</Window>

MyWindow.xaml.cs

public partial class MyWindow : Window, INotifyPropertyChanged
{
    public MyWindow()
    {
        InitializeComponent();
        this.MyDotNetProperty = "Go ahead. Change my value.";
        TopLevelContainer.DataContext = this;
    }

    private string m_sValue;
    public string MyDotNetProperty
    {
        get { return m_sValue; }
        set
        {
            m_sValue = value;
            if (null != this.PropertyChanged)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("MyDotNetProperty"));
            }
        }
    }

    #region INotifyPropertyChanged Members
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion
}

Ответ 2

Я чувствую необходимость добавить некоторую точность:

Связывание данных "двумя способами" больше, чем привязка данных "Один способ".

Связывание данных "одним способом" является привязкой от источника к свойству depency. Источник должен реализовать INotifyProertyChanged, чтобы получить распространение изменений от источника к цели.

Чтобы получить "2 way", чтобы получить распространение от Target to Source, это зависит от режима привязки, который вы установили в Binding. Если вы не установите BindingMode для вашей привязки, будет использоваться режим привязки по умолчанию, и этот режим по умолчанию является характеристикой вашего целевого свойства зависимостей.

Пример:

A Текстовое поле, связанное со строковым свойством, называемое "MyTextProperty". В коде вы привязываете Textbox.Text DependencyProperty к "MyTextProperty" на объекте "MyObject"

- > "односторонняя" привязка: установщик "My TextProperty" должен поднять событие "Свойство изменено", а "MyObject" должен реализовать INotifyPropertyChanged.

- > "2 способа связывания данных": в дополнение к тому, что необходимо для "одного способа", bindingMode должен быть установлен на "2 пути". В этом специальном случае Text DependencyProperty для текстового поля имеет режим "2 пути" в качестве режима по умолчанию, поэтому больше нечего делать!

Ответ 3

Возможно, нам понадобится код. Увеличивает ли ваше свойство string событие PropertyChanged? Или (еще лучше) реализовано как DependencyProperty? Если нет, связанный TextBox не будет знать, когда значение изменится.

Что касается ввода текста в TextBox и не видения изменения значения свойства, это может быть связано с тем, что ваш TextBox не теряет фокус. По умолчанию привязанные TextBoxes не записывают свои значения обратно в исходное свойство, пока фокус не покинет элемент управления. Попробуйте выполнить табуляцию и посмотрите, изменяется ли значение свойства.