Текстовое поле + привязка к свойству с INotifyPropertyChanged из другой сборки - PullRequest
1 голос
/ 17 ноября 2010

У меня проблема с обновлением значения свойства из кода, который привязан к текстовому полю (текстовое поле не отображает новое значение).

Обычно он работал без проблем, но в этом случае исходный класс находится в отдельной сборке (не знаю, имеет ли это какое-то значение).

  1. Если я наберу текстовое поле, значение будет обновлено в коде
  2. При изменении значения свойства непосредственно в текстовом поле кода не отображается новое значение.
  3. После изменения значения в текстовом поле еще раз ранее установленное значение (в коде) перезаписывается (поэтому привязка все еще работает).

Кроме того, я проверил, происходит ли событие PropertyChanged и происходит ли оно после каждого изменения.

Есть предположения, почему это не работает? Ниже соответствующий класс привязки и исходного кода.

TextBox Text = "{Binding Path = Description, Mode = TwoWay}"

[DataContract]
public class Source : INotifyPropertyChanged
{
    private String _Description;

    [DataMember]
    public String Description
    {
        get { return _Description; }
        set
        {
            if (_Description == value)
                return;

            _Description = value;
            OnPropertyChanged("Description");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
}

Я исправил проблему, очевидно, он не был связан с другой сборкой. У меня ошибка установки значения свойства.

1 Ответ

2 голосов
/ 17 ноября 2010

Работает нормально у меня.Единственное отличие заключается в удалении тега DataContract и назначении DataContext.и Мой образец следующий:

<Window x:Class="_4206499.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="360" Width="578">
<Grid>
    <TextBox Text="{Binding Path=Description, Mode=TwoWay}" VerticalAlignment="Center" Margin="12,12,286,278" />
    <Button Width="100" Margin="57,59,346,219" Click="Button_Click"></Button>
</Grid>

и код позади

<pre> using System; using System.Windows; using ClassLibrary1;</p> <p>namespace _4206499 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Source = new Source(); DataContext = Source; }</p> <pre><code> public Source Source { get; set;} private void Button_Click(object sender, RoutedEventArgs e) { Source.Description = DateTime.Now.ToString(); } }

}

и один из отдельной библиотеки классов:


using System;
using System.ComponentModel;</p>

<p>namespace ClassLibrary1
{
    public class Source : INotifyPropertyChanged
    {
        private String _Description;</p>

<pre><code>    public String Description
    {
        get { return _Description; }
        set
        {
            if (_Description == value)
                return;

            _Description = value;
            OnPropertyChanged("Description");
        }
    }

    public event PropertyChangedEventHandler PropertyChanged;

    protected virtual void OnPropertyChanged(string propertyName)
    {
        PropertyChangedEventHandler handler = this.PropertyChanged;
        if (handler != null)
        {
            var e = new PropertyChangedEventArgs(propertyName);
            handler(this, e);
        }
    }
}

}

...