将ViewModel属性绑定到View

时间:2014-05-23 13:25:50

标签: c# mvvm winrt-xaml windows-8.1

我有以下内容(页面和viewmodel类的基类):

  public class MySuperPage : Page {
      public MySuperPageViewModel VM = new MySuperPageViewModel();

      ..........
      ..........

      public class MySuperPageViewModel {
        protected bool _ShowProgress = false;
        public bool ShowProgress {
            get { return _ShowProgress; }
            set {
                _ShowProgress = value;
                OnPropertyChanged("ShowProgress");
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;

        public void OnPropertyChanged(string property) {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(property));
        }
      }
  }

然后是实际页面

  public class MyPage : MySuperPage(){
      public MyPage() : base() {
          this.InitializeComponent();
      }
  }

XAML如下:

  <my:MySuperPage
xmlns:my="using:MyNamespace"
x:Name="pageRoot"
x:Class="MyPages.MyPage"
DataContext="{Binding DefaultViewModel, RelativeSource={RelativeSource Self}}"
....>

     <ProgressRing IsActive="{Binding VM.ShowProgress, ElementName=pageRoot}" ... />

如果在代码隐藏中,我会执行

等操作
this.VM.ShowProgress = true; // or false

效果不明显。

相反,如果我将对象'VM'分配给DefaultViewModel(这是一个ObservableCollection),事情就会起作用:

 this.DefaultViewModel["VM"] = VM;

即,在最后一种情况下使用{Binding DefaultViewModel.VM.ShowProgress,ElementName = pageRoot}我设法让进度环反映VM实例的状态。

我想错过一些东西。

1 个答案:

答案 0 :(得分:1)

您网页中的ViewModel必须作为属性实现,才能使绑定工作。 变化

public MySuperPageViewModel VM = new MySuperPageViewModel();

private MySuperPageViewModel _vm = new MySuperPageViewModel();
public MySuperPageViewModel VM { get { return _vm; }}