我在更新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;
}
Session是MainView的一个属性,我希望在Session对象中更改Test属性时更新brandIDTBlock TextBlock。
Test属性声明如下:
private string _test = "Test Value Binding";
public string Test
{
get { return _test; }
set { _test = value; }
}
现在有些工作就像我运行应用程序时看到“Test Value Binding”正确显示在我的视图中,问题是当我的Session对象中的Test值发生变化时,更改不会传播到视图
我还试图像这样实现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));
}
}
但它仍未更新。
更新:事实证明,这又是一个不起眼的错误。在我的Snapshot.xaml.cs中,我正在更改处理饼图的片段代码中的数据上下文。我通过改变我的绑定表达来解决它,以便绑定元素将成为Snapshot.xaml的父节点,在我的例子中是StackPanel'sp'({Binding ElementName = sp,Path = DataContext.Session.Test})。除了这个愚蠢的错误,原始代码中真正缺少的是INotifyPropertyChanged实现,不需要TwoWay绑定。
由于
路易斯
答案 0 :(得分:1)
您需要在绑定中添加Mode=TwoWay
:
<local:Snapshot BrandID="{Binding Path=Session.Test, Mode=TwoWay}" />
OneWay
是默认值,允许UI仅更新绑定值。要在更改绑定值后更改UI,您需要TwoWay
。
您还需要引发属性更改事件,让UI知道某些内容已更改。
唯一的另一件事是检查您是否正确设置了视图的DataContext
。
答案 1 :(得分:0)
绑定不正确。通过使用只有路径的{Binding},您尝试绑定到通过DataContext公开的数据。你设置了DataContext吗?
修改强>
您的代码中存在更多错误:
control.brandIDTBlock.Text = (string)e.NewValue;
此行不属于PropertyChanged处理程序。并且可能会让您认为绑定正在发挥作用。
我没有时间添加正确的示例here is a link that should get you started.
答案 2 :(得分:0)
当视图模型中Test
的值发生变化时,它会“更改”,因为您已将所返回的对象替换为主视图模型的Session
属性。如果是这样,您需要主视图模型来实现INotifyPropertyChanged
,并在更新Session属性时调用PropertyChanged。