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

29
задан ASh 6 October 2018 в 09:19
поделиться

2 ответа

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

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

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

Обновление: Хорошо OP, это была бы пустая трата времени, если я рявкал неправильное дерево.. так или иначе теперь, так как необходимо было вырыть немного.. Вы будете помнить его в течение долгого времени. Вот фрагмент кода для закругления этого ответа. Также найденный, что обновление текстового поля происходит автоматически, как только я снабжаю вкладками.. Только необходимо вручную подписаться на событие и обновить UI, если объект 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
}
59
ответ дан Gishu 28 November 2019 в 01:12
поделиться

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

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

3
ответ дан Matt Hamilton 28 November 2019 в 01:12
поделиться
Другие вопросы по тегам:

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