我有以下内容(页面和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实例的状态。
我想错过一些东西。
答案 0 :(得分:1)
您网页中的ViewModel必须作为属性实现,才能使绑定工作。 变化
public MySuperPageViewModel VM = new MySuperPageViewModel();
到
private MySuperPageViewModel _vm = new MySuperPageViewModel();
public MySuperPageViewModel VM { get { return _vm; }}