嵌套属性propertychanged事件仅在silverlight中的usercontrol中触发一次

时间:2015-09-06 08:59:10

标签: c# silverlight user-controls dependency-properties propertychanged

有两个Viewmodel,它们都实现了Agent1 R F 2 0 Agent4 C E 2 2 Agent3 R F 3 11 Agent2 R B 4 5 接口(我在实际代码中调用了INotifyPropertyChanged。)

OnpropertyChanged("propertyname")

我还有 Public Class A{ public B BProperty { get { return _BProperty; } set { if (_BProperty != null) _BProperty.PropertyChanged -= _BProperty_PropertyChanged; _BProperty = value; OnPropertyChanged("BProperty"); if (_BProperty != null) _BProperty.PropertyChanged += _BProperty_PropertyChanged; } } void _BProperty_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e) { if (e.PropertyName == "status") { OnPropertyChanged("BProperty"); } } B _BProperty; } Public Class B { public int status{get;set;} }

userControl

我有一个dependencyProperty:

<MyUserControl  ...
                ... >
   <Grid>
   </Grid>
</MyUserControl>

编辑:2015年9月21日 添加get / set方法:

/// <summary>
/// File status
/// </summary>
public int Filestatus
{
    get { return (int)GetValue(FilestatusProperty); }
    set { SetValue(FilestatusProperty, value); }
}

public static readonly DependencyProperty FilestatusProperty =
    DependencyProperty.Register(
    "Filestatus",
    typeof(int),
    typeof(MyUserControl),
    new PropertyMetadata(0, OnFilestatusPropertyChanged));

private static void OnFilestatusPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
    MyUserControl control = (MyUserControl)d;

    if (e.NewValue != null)
    {
    }
}

编辑结束

我在我的主页中使用了这个userControl,如下所示:

        public static readonly DependencyProperty FileStatusProperty = DependencyProperty.RegisterAttached(
"FileStatus", typeof(int), typeof(FileStatusIconControl), new PropertyMetadata(0, PropertyChangedCallback));

    public static int GetFileStatus(DependencyObject source)
    {
        return (int)source.GetValue(FileStatusProperty);
    }

    public static void SetFileStatus(DependencyObject target, int value)
    {
        target.SetValue(FileStatusProperty, value);
    }

    private static void PropertyChangedCallback(
        DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
    {
        FileStatusIconControl fsic = dependencyObject as FileStatusIconControl;
        if(fsic != null)
            wahahahahaha;
    }

mainPage的datacontext是A类的实例。

我的问题是: 更改状态后,文本框的文本会更改,但<mainPage ... ...> <Grid> <MyUserControl Filestatus={Binding Bproperty.status} /> <TextBox Text={Binding Bproperty.status} /> </Grid> </mainPage> 方法仅在加载OnFilestatusPropertyChanged时调用一次。为什么? 感谢。

1 个答案:

答案 0 :(得分:2)

我首先要说的是,在我查看您的问题时,我遇到了您提供的代码的一些问题。我感谢你在某个地方有一些有问题的真实代码而你无法与我们分享这些代码所以试图在一小组文件中重现这个问题。

但是,如果您这样做,请至少验证您提供的代码是否运行并显示问题。很明显,您没有尝试运行示例代码(尤其是XAML),因为它存在问题:

  • 属性值应以双引号包围,
  • 绑定路径Bproperty.status应为BProperty.status(首先P大写)。

所有这些事情都会减缓有人试图帮助你。更糟糕的是,当我发现你的代码出现问题时,我无法确定你的真实代码是否存在真正的问题,或者是否是你引入的示例代码。所以我所能做的就是指出我发现的所有问题,希望其中一个是您在实际代码中遇到的问题。

首先,您的TextBox Text属性绑定不包含Mode=TwoWay。在WPF中,默认情况下此绑定为TwoWay,但在Silverlight中,默认情况下所有绑定均为OneWay。如果您熟悉WPF,这可能就是您省略Mode=TwoWay

的原因

其次,我不明白为什么你已经实现了类B,显然是将它留给了A类来代表它发起属性更改的事件。此方法不起作用:当Silverlight更新status实例的B属性中的值时,它通过调用status实例的B setter来实现。您的B类只有一个自动生成的属性设置器,它肯定不会触发PropertyChanged事件。由于此事件未被触发,因此Silverlight不知道有一些更新要做,而且您的A类也不知道它已更改。

我会通过在INotifyPropertyChanged设置器中调用B,以通常的方式在课程OnPropertyChanged中实施status。我还会删除类BProperty_PropertyChanged中的A事件处理程序,因为我认为它不会对您有所帮助。