依赖属性不更新Silverlight 4

时间:2011-04-14 09:44:02

标签: silverlight dependency-properties

我在更新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绑定。

由于

路易斯

3 个答案:

答案 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。