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));
}
我正在制作一个处理 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));
}