INotifyPropertyChanged 和数据绑定

INotifyPropertyChanged and DataBinding

我正在制作一个处理 CardReader 的测试应用程序,我有一个包含 CardReader 状态的枚举和一个带有 TextBlock 的 XAML window,我希望状态改变时onPropertyChanged 使用状态名称更改 TextBlock。

这是我的部分代码:

public class CardControler : INotifyPropertyChanged
{

    private CardState state;

    public CardState State
    {
        get { return state; }
        set
        {
            if (state != value)
            {
                state = value;
                OnPropertyChanged(state);
            }
        }
    }
public event PropertyChangedEventHandler PropertyChanged;

    protected void OnPropertyChanged(CardState state)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(state.ToString()));
        }

    }

................................................ .........

public partial class CardReader : Window
{

    public CardControler control { get; set; }

    public CardReader(int port)
    {

        this.DataContext = control;
        this.port = port;            
        InitializeComponent();
        ScreenWrite(CardState.Initializing);
        Thread thread = new Thread(new ThreadStart(asincControlCreate));
        thread.Start();

    }

并且在 xaml

<TextBlock Name="Screen" Text="{Binding Path=control.state}></TextBlock>

我希望我的解释正确,有人可以帮助我。 提前致谢

您应该传递更改的 属性 的名称,而不是它的值:

PropertyChanged(this, new PropertyChangedEventArgs("State"));

以下行不正确,因为您应该将 propertyName 作为参数而不是 state.ToString():

PropertyChanged(this, new PropertyChangedEventArgs(state.ToString()));

所以您的代码应该类似于:

public CardState State
{
    get { return state; }
    set
    {
        if (state != value)
        {
            state = value;
            OnPropertyChanged("State");
        }
    }
}

public event PropertyChangedEventHandler PropertyChanged;

protected void OnPropertyChanged(string propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

除此之外,请记住 xaml 区分大小写,因此 {Binding State}{Binding state} 不同。

您绑定中 属性 的大小写需要匹配 public 属性(State,而不是 state):

<TextBlock Name="Screen" Text="{Binding Path=control.State}></TextBlock>

我认为问题在于您使用正在更改的 提高 OnPropertyChanged,而不是实际的 属性 名称(即 "State" 在这种情况下)。

protected void OnPropertyChanged(String propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

我怀疑您还需要更改 XAML 以绑定到适当的 属性(注意,属性 名称是 State 而不是 state - XAML 区分大小写):

<TextBlock Name="Screen" Text="{Binding Path=control.State}></TextBlock>

您已经将页面的数据上下文设置为 control,因此您的绑定

<TextBlock Name="Screen" Text="{Binding Path=control.state}></TextBlock>

会出错

你的绑定应该是

<TextBlock Name="Screen" Text="{Binding Path=State}></TextBlock>

而不是

public CardControler control { get; set; }

试试这个:

public CardControler control = new CardControler();

您的 OnPopertyChanged 事件调用是错误的,您必须传递 属性 名称作为参数。您可以添加我在下面添加的代码。这样你就可以避免完全传递参数名称。

     public event PropertyChangedEventHandler PropertyChanged;

     protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
     {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
     }