2014-04-10 169 views
0

我做了一个尽可能简单的例子。
我有一个ViewModelMain类,它将实现几个视图模型。
我想绑定我的ViewModelMain视图模型上的滑动值。 这里我的代码:wpf mvvm绑定到子viewmodel.property

MainWindow.xaml.cs
我在这里设置datacontext,不知道它是否真的是个好主意。

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
     VMMain vm = new VMMain(); 
     this.DataContext = vm; 
    } 
} 

MainWindow.xaml

<Window x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Slider Height="23" Name="page_slider" Width="100" Value="{Binding Path=p.NbrLine}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Minimum="0" Maximum="10"/> 
    <TextBox Text="{Binding Value, ElementName=page_slider, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Height="28" HorizontalAlignment="Stretch" Name="Voiture1Label" VerticalAlignment="Stretch" Margin="0,110,0,172"></TextBox> 
</Grid></Window> 

ViewModelMain.cs ViewModelBase:它实现INotifyPropertyChanged ModelPage类:我的模型 我的页面:我的子视图模式是ModelPage ViewModelMain的视图模型:我最终的viewmodel将实现更多的viewmodel

public class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propName)); 
     } 
    } 
} 

public class ModelPage 
{ 
    public int NbrLine { get; set; } 
    public int NbrCapsLock { get; set; } 
} 

public class MyPage : ViewModelBase 
{ 
    private ModelPage _model; 

    public MyPage(ModelPage m) 
    { 
     _model = m; 
    } 
    public int NbrLine 
    { 
     get { return (_model.NbrLine); } 
     set 
     { 
      if (_model.NbrLine == value) return; 
      _model.NbrLine = value; 
      OnPropertyChanged("NbrLine"); 
     } 
    } 

    public int NbrCapsLock 
    { 
     get { return (_model.NbrCapsLock); } 
     set 
     { 
      if (_model.NbrCapsLock == value) return; 
      _model.NbrCapsLock = value; 
      OnPropertyChanged("NbrCapsLock"); 
     } 
    } 
} 

public class ViewModelMain 
{ 
    public MyPage p; 

    public ViewModelMain() 
    { 
     p = new MyPage(new ModelPage(){NbrLine = 5, NbrCapsLock = 1}); 
    } 
} 

当我启动它时,我的滑块仍然在0不明白为什么它不在5. 5

回答

3

p是一个字段,而不是一个属性。你应该只绑定属性:

public MyPage p { get; set; } 
2

其实你可以把p转换成属性那样。 WPF无法绑定到简单的属性。

public class ViewModelMain 
{ 
    public MyPage p { get; set; } 

    public ViewModelMain() 
    { 
     p = new MyPage(new ModelPage() { NbrLine = 5, NbrCapsLock = 1 }); 
    } 
}