这是我在CustomButton中定义的属性:
public bool IsOn
{
get { return (bool)GetValue(IsOnProperty); }
set
{
SetValue(IsOnProperty, value);
if (IsOn)
VisualStateManager.GoToState(this, "On", true);
else
VisualStateManager.GoToState(this, "Off", true);
}
}
public static readonly DependencyProperty IsOnProperty =
DependencyProperty.Register("IsOn",
typeof(bool),
typeof(ImageButton),
new PropertyMetadata(false));
在我的Xaml中,它绑定到下面的另一个布尔列表:
IsOn="{Binding Sender.IsPinned, Mode=OneWay}"
和Sender.IsPinned引发了PropertyChange
public bool IsPinned
{
get { return _model.IsPinned; }
set
{
_model.IsPinned = value;
RaisePropertyChanged("IsPinned");
}
}
protected void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public event PropertyChangedEventHandler PropertyChanged;
当IsPin更改时,IsOn根本看不到更改。但是当我保存数据并刷新UI时,更改会反映在IsOn上。
似乎没有实现PropertyChangedEventHandler,但是在调试时,它会调用该事件。
答案 0 :(得分:0)
我相信您的代码(未显示)正在直接更改_model.IsPinned
而不更改具有绑定通知的IsPinned
属性。这会导致IsOn
更新失败。
_model.IsPinned
使用的支持变量IsPinned
不能由IsPinned
setter以外的任何内容更改;这样IsOn
可以注意到它的变化。
必须直接更改IsPinned
属性(随后更改_model.IsPinned
),否则绑定无法获取对后备存储_model.IsPinned
的任何更改。
- 或 ---
当变量_model.IsPinned
更改为设置者之外时,只需致电RaisePropertyChanged("IsPinned");
即表示更改为IsOn
。
答案 1 :(得分:0)
这就是我解决它的方式
public bool IsOn
{
get
{
return (bool)GetValue(IsOnProperty);
}
set
{
SetValue(IsOnProperty, value);
}
}
public static readonly DependencyProperty IsOnProperty =
DependencyProperty.Register("IsOn", typeof(bool), typeof(ImageButton), new PropertyMetadata(false, Changed));
private static void Changed(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ImageButton img = (ImageButton)d;
if (img.IsOn)
VisualStateManager.GoToState(img, "On", true);
else
VisualStateManager.GoToState(img, "Off", true);
}