绑定项到DependencyProperty不传播值

时间:2015-07-22 17:03:40

标签: xaml data-binding windows-8.1

这是我在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,但是在调试时,它会调用该事件。

2 个答案:

答案 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);
        }