绑定到ViewModel中的对象属性,或者如何使用具有相同属性名称的多个模型



我正试图通过文本框中的ViewModel绑定到Model的属性。我在ViewModel中创建了一个包装来访问Model的属性。每当我在这个包装器的get部分中放置一个断点时,它就会触发,但在更改文本框内容后,set部分中的断点不会执行。代码是根据以下教程编写的:https://www.codeproject.com/Articles/1193164/MVVM-Sample-application-with-a-focus-in-property

BaseViewModel实现了INPC接口。我正试图遵循MVVM";拇指法则;尽可能接近。因此,在这种情况下,模型中没有INPC实现,视图只能绑定到VM。

我做错了什么?

XAML:

<TextBox Grid.Column="1" VerticalAlignment="Center" Text="{Binding Path=ProgramInfo.Name, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

型号:

public class ProgramInfo 
{
private string _name;
private string _description;

public string Name
{
get => _name;
set
{
_name = value;
}
}
public string Description
{
get => _description;
set
{
_description = value;
}
}

}

ViewModel:

class ProgramInfoViewModel : BaseViewModel
{
private ProgramInfo _programInfo;
public ProgramInfo ProgramInfo
{
get => _programInfo;
set
{
_programInfo = value;
OnPropertyChanged("ProgramInfo");
}
}
}

代码背后:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ProgramInfoViewModel();
}
}

_programInfo始终为null。您需要创建一个实例:

class ProgramInfoViewModel : BaseViewModel
{
private ProgramInfo _programInfo = new ProgramInfo();
public ProgramInfo ProgramInfo
{
get => _programInfo;
set
{
_programInfo = value;
OnPropertyChanged("ProgramInfo");
}
}
}

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = new ProgramInfoViewModel { ProgramInfo = new ProgramInfo() };
}
}

模型属性的视图模型包装器将如下所示:

class ProgramInfoViewModel : BaseViewModel
{
private ProgramInfo _programInfo;
private ProgramInfoViewModel(ProgramInfo programInfo)
{
_programInfo = programInfo;
}
public string ProgramInfoName
{
get => _programInfo.Name;
set
{
_programInfo.Name = value;
OnPropertyChanged("ProgramInfoName");
}
}
}

初始化:

public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
var model = new ProgramInfo();
DataContext = new ProgramInfoViewModel(model);
}
}

绑定路径必须相应地改变:

<TextBox Text="{Binding Path=ProgramInfoName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

最新更新