WPF绑定不适用于UserControl

时间:2013-05-19 16:24:21

标签: wpf mvvm binding user-controls dependency-properties

在我的MainViewModel我有一个属性,由用户设置。收到新值后,我想在UserControl更新信息。问题是绑定不起作用。我希望它的工作方式如下。更改SelectedDay后,后面的用户控件代码中的Day属性也会更改,从而调用CalculateDay方法。但是,永远不会调用此方法!

我想,原因很简单,我只是不完全理解绑定机制,但我无法弄清楚出了什么问题,现在我真的需要一些帮助。我已经检查了一些类似的问题,但从未找到合适的答案。

我的代码:

MainViewModel

private Day _selectedDay;
public Day SelectedDay
{
    get { return _selectedDay; }
    set
    {
        _selectedDay = value;
        RaisePropertyChanged("SelectedDay");
    }
}

MainWindow XAML

<controls:DayControl Day="{Binding SelectedDay, Mode=TwoWay}"></controls:DayControl>

UserCotrol代码

public Day Day
{
    get { return (Day)GetValue(DayProperty); }
    set
    {
        SetValue(DayProperty, value);
        CalculateDay();
    }
}

public static readonly DependencyProperty DayProperty =
    DependencyProperty.Register("Day", typeof(Day), typeof(DayControl), new PropertyMetadata(new Day()));

2 个答案:

答案 0 :(得分:2)

根据此msdn

  

除了特殊情况外,你的包装实现   应分别仅执行GetValue和SetValue操作。   其原因在XAML Loading和主题中讨论   依赖属性。

您应该在依赖属性的定义中使用PropertyChangedCallBack。以下是直接取自msdn。

的代码
public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender, 
      new PropertyChangedCallback(OnUriChanged)
  )
);

定义 CalculateDay 代替上面的 OnUriChanged

答案 1 :(得分:0)

我没有看到您在代码中使用DependencyProperty的原因。在MainViewModel中,您拥有所需的一切。

在代码后面只添加到构造函数:

this.DataContext = new MainViewModel(); 

接下来,将CalculateDay方法移至MainViewModel并以SelectedDay

的set方法调用它