如何解决依赖属性不会更新Silverlight 4
| 我在更新UserControl / View的依赖项属性时遇到了一些麻烦。 我有一个主视图(MainView.xaml),该视图中声明了一系列其他用户控件。其中之一如下所示:<local:Snapshot BrandID=\"{Binding Path=Session.Test}\" />
我的Snapshot.xaml有一个TextBlock:
<TextBlock Text=\"Sample text\" x:Name=\"brandIDTBlock\" />
我的Snapshot.xaml.cs具有以下依赖项属性:
public string BrandID
{
get { return (string)GetValue(BrandIdProperty); }
set { SetValue(BrandIdProperty,value); }
}
public static readonly DependencyProperty BrandIdProperty = DependencyProperty.Register(\"BrandID\",typeof(string),typeof(Snapshot),new PropertyMetadata(new PropertyChangedCallback(OnBrandIdChange)));
private static void OnBrandIdChange(DependencyObject d,DependencyPropertyChangedEventArgs e)
{
var control = (Snapshot)d;
control.brandIDTBlock.Text = (string)e.NewValue;
}
会话是MainView的属性,并且我希望在Session对象中更改Test属性时更新我的brandIDTBlock TextBlock。
Test属性的声明如下:
private string _test = \"Test Value Binding\";
public string Test
{
get { return _test; }
set { _test = value; }
}
现在某事正在运行,因为当我运行该应用程序时,我看到“ Test Value Binding \”正确显示在视图中,问题是当Test的值在我的Session对象中更改时,更改不会传播到视图。
我还尝试实现INotifyPropertyChanged接口,如下所示:
public string Test
{
get { return _test; }
set
{
_test = value;
OnPropertyChanged(\"Test\");
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this,new PropertyChangedEventArgs(name));
}
}
但它仍未更新。
更新:事实证明,这再次是一个nooby错误。在我的Snapshot.xaml.cs中,我正在处理饼图的片段代码中更改数据上下文。我通过更改绑定表达式来解决此问题,使绑定元素成为Snapshot.xaml的父元素,在我的情况下为StackPanel \'sp \'({Binding ElementName = sp,Path = DataContext.Session.Test}) 。除了这个愚蠢的错误之外,我的原始代码中真正缺少的是INotifyPropertyChanged实现,TwoWay绑定是不必要的。
谢谢
路易斯
解决方法
您需要在绑定中添加“ 5”:
<local:Snapshot BrandID=\"{Binding Path=Session.Test,Mode=TwoWay}\" />
OneWay
是默认值,它允许UI仅更新绑定值。要使UI在绑定值更改后发生更改,您需要TwoWay
。
您还需要引发属性更改事件,以使UI知道某些更改。
唯一的另一件事是检查您是否已正确设置视图的DataContext
。
,绑定不正确。通过仅使用路径的{Binding},您可以尝试绑定到通过DataContext公开的数据。您是否设置了DataContext?
编辑
您的代码中还有更多错误:
control.brandIDTBlock.Text = (string)e.NewValue;
该行不属于PropertyChanged处理程序。并可能使您认为绑定起作用。
我没有时间添加正确的示例,因此,这里的链接应该可以帮助您入门。
,当视图模型中Test
的值更改时,它是\“ changing \”,因为已替换了要返回的对象,所以它是主视图模型的Session
属性。如果是这样,您将需要主视图模型来实现INotifyPropertyChanged
并在Session属性更新时调用PropertyChanged。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。