首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >INotifyPropertyChanged和DataBinding

INotifyPropertyChanged和DataBinding
EN

Stack Overflow用户
提问于 2015-01-27 14:30:50
回答 7查看 129关注 0票数 0

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

下面是我代码的一部分:

代码语言:javascript
复制
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()));
        }

    }

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

代码语言:javascript
复制
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中

代码语言:javascript
复制
<TextBlock Name="Screen" Text="{Binding Path=control.state}></TextBlock>

我希望我能正确地解释我的自我,有人能帮助我。提前感谢

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-01-27 14:38:50

我认为问题在于,您使用的是正在更改的OnPropertyChanged值,而不是实际的属性名称(即(本案中的“国家”)。

代码语言:javascript
复制
protected void OnPropertyChanged(String propertyName)
{
    if (PropertyChanged != null)
    {
        PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

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

代码语言:javascript
复制
<TextBlock Name="Screen" Text="{Binding Path=control.State}></TextBlock>
票数 1
EN

Stack Overflow用户

发布于 2015-01-27 14:37:28

下面的行是不正确的,因为您应该将propertyName作为参数传递而不是state.ToString()

代码语言:javascript
复制
PropertyChanged(this, new PropertyChangedEventArgs(state.ToString()));

因此,您的代码应该类似于:

代码语言:javascript
复制
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}不一样。

票数 2
EN

Stack Overflow用户

发布于 2015-01-27 14:36:45

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

代码语言:javascript
复制
PropertyChanged(this, new PropertyChangedEventArgs("State"));
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28172904

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档