繁体   English   中英

wpf mvvm绑定到子viewmodel.property

[英]wpf mvvm binding to sub viewmodel.property

我举了一个尽可能简单的例子。
我有一个ViewModelMain类,它将实现多个viewmodel。
我试图将我的滑块值绑定到ViewModelMain中的viewmodel上。 这是我的代码:

MainWindow.xaml.cs
我在这里设置数据上下文,不知道这是否真的是一个好主意。

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:我的模型MyPage:我的子视图模式,它是ModelPage的视图模型ViewModelMain:我的最终视图模型,它将实现更多的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上。

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

public MyPage p { get; set; }

实际上,您应该像这样将p转换为属性。 WPF无法绑定到简单属性。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM