我正在尝试将xaml中标签的内容绑定到C#后面的公共变量。永远不会从UI设置值,它应该触发C#中的值。
这个VS2008 C#+ WPF
然而,它没有编译,它说:
错误CS1502:
的最佳重载方法匹配'System.Windows.DependencyObject.OnPropertyChanged(System.Windows.DependencyPropertyChangedEventArgs)' 有一些无效的论点
错误CS1503:参数'1':无法从'string'转换为 'System.Windows.DependencyPropertyChangedEventArgs'
这是一些代码
C#代码
private bool _isLogOn;
public bool IjmFinished
{
get
{
// return _fl.ProcessFinished;
return _isLogOn;
}
set
{
_isLogOn = value;
OnPropertyChanged("IjmFinished");
}
}
xaml
<Label Margin="120,0,0,82" Height="30" VerticalAlignment="Bottom" Content="{Binding Path = IjmFinished, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, Converter={StaticResource IjmFinishedStatusConverter}}" HorizontalAlignment="Left" Width="80" />
如果我取消注释OnPropertyChanged("IjmFinished");
它可以编译。我想知道我哪里做错了,我该怎么改呢?谢谢。
答案 0 :(得分:3)
看起来你正在调用类中的一个方法来处理依赖属性更改。相反,您需要提升INotifyPropertyChanged.PropertyChanged
事件:
PropertyChanged(this, new PropertyChangedEventArgs("ImFinished"));
请注意,通常您将在基本视图模型类中为此编写一个辅助方法,如下所示:
protected void RaisePropertyChanged(string propertyName)
{
var evt = PropertyChanged; // create local copy in case the reference is replaced
if (evt != null) // check if there are any subscribers
evt (this, new PropertyChangedEventArgs(propertyName));
}
这样您就可以使用RaisePropertyChanged("ImFinished")
。
最后一点说明:C#版本5有一个新属性CallerMemberName
,允许RaisePropertyChanged
方法获取调用属性的名称:
protected void RaisePropertyChanged([CallerMemberName]string propertyName = null)
{
var evt = PropertyChanged; // create local copy in case the reference is replaced
if (evt != null) // check if there are any subscribers
evt (this, new PropertyChangedEventArgs(propertyName));
}
这使您无需使用魔术字符串来指定属性名称 - 只需从属性设置器中调用RaisePropertyChanged()
。