c# - wpf mvvm 绑定(bind)到子 viewmodel.property

标签 c# wpf xaml mvvm binding

我做了一个尽可能简单的例子。
我有一个 ViewModelMain 类,它将实现多个 View 模型。
我正在尝试将我的 slider 值绑定(bind)到我的 ViewModelMain 中的 View 模型上。 这是我的代码:

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

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

主窗口.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 的​​类 模型页面:我的模型 MyPage :我的 subview 模式,它是 ModelPage 的 View 模型 ViewModelMain :我的最终 View 模型,它将实现更多 View 模型

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});
    }
}

当我启动它时,我的 slider 仍然在 0 上,不明白为什么它不在 5 上。

最佳答案

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

public MyPage p { get; set; }

关于c# - wpf mvvm 绑定(bind)到子 viewmodel.property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22985472/

相关文章:

WPF动画 "Cannot freeze this Storyboard timeline tree for use across threads"

c# - 如何将控件绑定(bind)到DataGrid中的当前行?

c# - 无法在我的 View 中绑定(bind)超链接命令和 ICommand

c# - 为项目列表选择正确的控件

xaml - 在 MultiSelect ListView (UWP) 中隐藏默认复选框

c# - 如何从命令行执行omnisharp来格式化c#源文件?

c# - 如何检查 radComboboxItem 'CheckBox' ?

c# - WPF ICommand CanExecute():RaiseCanExecuteChanged()还是通过DispatchTimer自动处理?

c# - WPF:更改某些组合框项目的背景

c# - 使用 .Net 持久存储加密数据