如何将UserControl中的DependencyProperty绑定到DataContext属性? Windows应用商店

时间:2013-02-12 19:58:52

标签: c# mvvm winrt-xaml

我有一个带有依赖属性的UserControl:

 public static readonly DependencyProperty Step2CommandProperty =
        DependencyProperty.Register("Step2Command", typeof(ICommand), typeof(MyTripNavigationStep), new PropertyMetadata(null));

    public ICommand Step3Command
    {
        get { return (ICommand)GetValue(Step3CommandProperty); }
        set { SetValue(Step3CommandProperty, value); }
    }

然后我有一个带有ICommand属性的ViewModel:

  public ICommand SaveStep1Command
    {
        get
        {
            return new RelayCommand(() =>
            {


            });

        }
    }

然后我在Page中绑定了两个这样的属性,其中我将viewModel作为DataContext和UserControl。

            <UserControls:Step Step3Command="{Binding SaveStep1Command, Mode=OneWay}" />

未应用绑定,userControl中的Step3Command始终显示为null。 我知道DataContext工作正常,并且Visual Studio不允许我放置TwoWay绑定。我正在使用GalaSoft Simple Mvvm和Visual Studio CTP update 2.

任何人都知道我做错了什么?感谢。

2 个答案:

答案 0 :(得分:1)

您定义了属性错误。每次访问属性时都会调用get块,因此每当您(或WPF中的MVVM魔法)访问SaveStep1Command时,都会创建一个新命令。这不是你想要的。

像这样重写属性:

在构造函数代码中,写:

SaveStep1Command = new RelayCommand(...)

并按照以下方式定义您的属性:

public ICommand SaveStep1Command { get; }

如果您使用的是旧版本的.net / C#,则必须按如下方式定义:

public ICommand SaveStep1Command { get; private set; }

解释尝试:可能是数据绑定仅创建弱引用。通过定义SaveStep1Command的方式,一旦设置了绑定,就会创建它,然后它就会出现在#34;在堆上 - 当GC下次启动时,空间被释放,因为它没有强引用。

答案 1 :(得分:0)

是。问题是您没有处理DP的Changed事件。

  

参考:https://blog.jerrynixon.com/2013/07/solved-two-way-binding-inside-user.html