我有一个简单的约束性问题,因为我觉得我错过了一些关于绑定如何工作的基本问题。
我假设因为我已经将我的MainWindow的DataContext设置为代码隐藏中的ViewModel,所以除非另有说明,否则MainWindow.xaml中的所有绑定都将假定此DataContext的源。当我使用我的UserControl(它本身有一个ViewModel驱动它)时,情况似乎并非如此。
我的方案最好用代码描述:
MainWindow.xaml.cs
private ViewModels.MainMenuViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = new ViewModels.MainMenuViewModel();
this.DataContext = vm;
}
MainWindow.xaml(使用代码隐藏中设置的数据上下文)
x:Class="Mediafour.Machine.EditorWPF.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:uc="clr-namespace:Machine.EditorWPF.Views"
xmlns:local="clr-namespace:Machine.EditorWPF"
xmlns:localVM="clr-namespace:Machine.EditorWPF.ViewModels"
Title="MainWindow" Height="350" Width="650">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto"/>
</Grid.ColumnDefinitions>
<uc:MachineTreeView x:Name="MachineTreeView" Grid.Column="0" MachineDocument="{Binding Path=CurrentDocument}" />
MainWindowViewModel.cs
public class MainWindowViewModel : ObservableObject
{
public MainWindowViewModel()
{
OpenMachine(@"D:\Projects\Agnes\EditorWPF\Test.machine");
}
private void OpenMachine(string filePath)
{
MachineDocument currentDocument = MachineDocument.OpenFile(filePath);
CurrentDocument = currentDocument;
}
private MachineDocument _currentDocument;
public MachineDocument CurrentDocument
{
get { return _currentDocument; }
set
{
if (_currentDocument != null)
{
_currentDocument.Dispose();
_currentDocument = null;
}
_currentDocument = value;
base.RaisePropertyChanged("CurrentDocument"); //this fires
}
}
使用此方法,MainWindow.xaml中的绑定语句出错。查看Snoop绑定错误,它指出在 MachineViewModel
中找不到 CurrentDocument 属性System.Windows.Data Error: 40 : BindingExpression path error: 'CurrentDocument' property not found on 'object' ''MachineViewModel' (HashCode=27598891)'. BindingExpression:Path=CurrentDocument; DataItem='MachineViewModel' (HashCode=27598891); target element is 'MachineTreeView' (Name='MachineTreeView'); target property is 'MachineDocument' (type 'MachineDocument')
在 MainWindow 中完成绑定时,为什么要查看 MachineViewModel ?
MainWindow中的其他绑定属性确实按预期工作,但这是我唯一的UserControl绑定。
答案 0 :(得分:2)
这是一个简单的错误
MainMenuViewModel
设置为MainWindowViewModel
而非MainWindow.DataContext
或者
DataContext
。看看这个Simple Pattern for Creating Re-useable UserControls以正确的方式做到这一点。