【发布时间】:2013-11-23 20:53:50
【问题描述】:
我被困在通过 MainViewModel 将 2 个 ViewModel 绑定到一个 View 上。
我的 MainWindow.xaml 如下所示:
<Window x:Class="Dojo4.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:ViewModels="clr-namespace:Dojo4.ViewModels"
Title="Dojo4" Height="346" Width="706">
<Window.DataContext>
<ViewModels:MainViewModel/>
</Window.DataContext>
<Grid>
<Button Content="Register" DataContext="{Binding RegisterViewModel}" Command="{Binding Register}" HorizontalAlignment="Left" Margin="19,63,0,0" VerticalAlignment="Top" Width="75"/>
<Label Content="Registration Name
" HorizontalAlignment="Left" Margin="10,10,0,0" VerticalAlignment="Top" Height="25"/>
<Label Content="Field Size" HorizontalAlignment="Left" Margin="161,10,0,0" VerticalAlignment="Top" Height="25"/>
<Label Content="X" HorizontalAlignment="Left" Margin="161,35,0,0" VerticalAlignment="Top" Height="25"/>
<Label Content="Y" HorizontalAlignment="Left" Margin="203,35,0,0" VerticalAlignment="Top" Height="25"/>
<TextBox DataContext="{Binding RegisterViewModel}" Text="{Binding Name}" MaxLength="8" HorizontalAlignment="Left" Height="23" Margin="19,35,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/>
<TextBox DataContext="{Binding RegisterViewModel}" HorizontalAlignment="Left" Height="23" Margin="161,62,0,0" TextWrapping="Wrap" Text="{Binding X}" VerticalAlignment="Top" Width="23"/>
<TextBox DataContext="{Binding RegisterViewModel}" HorizontalAlignment="Left" Height="23" Margin="203,62,0,0" TextWrapping="Wrap" Text="{Binding Y}" VerticalAlignment="Top" Width="23"/>
<Button Content="Up" DataContext="{Binding PlayerControlViewModel}" Command="{Binding MovePlayer}" CommandParameter="up" HorizontalAlignment="Left" Margin="79,118,0,0" VerticalAlignment="Top" Width="75" IsEnabled="False"/>
<Button Content="Down" DataContext="{Binding PlayerControlViewModel}" Command="{Binding MovePlayer}" CommandParameter="down" HorizontalAlignment="Left" Margin="79,226,0,0" VerticalAlignment="Top" Width="75" IsEnabled="False"/>
<Button Content="Left" DataContext="{Binding PlayerControlViewModel}" Command="{Binding MovePlayer}" CommandParameter="left" HorizontalAlignment="Left" Margin="10,173,0,0" VerticalAlignment="Top" Width="75" RenderTransformOrigin="0.707,0.409" IsEnabled="False"/>
<Button Content="Right" DataContext="{Binding PlayerControlViewModel}" Command="{Binding MovePlayer}" CommandParameter="right" HorizontalAlignment="Left" Margin="145,173,0,0" VerticalAlignment="Top" Width="75" IsEnabled="False"/>
</Grid>
我的 MainViewModel 如下:
namespace Dojo4.ViewModels
{
class MainViewModel : BaseViewModel
{
private RegistrationViewModel _RegistrationViewModel;
public RegistrationViewModel RegistrationViewModel
{
get { return _RegistrationViewModel; }
}
private PlayerControlViewModel _PlayerControlViewModel;
public PlayerControlViewModel PlayerControlViewModel
{
get { return _PlayerControlViewModel; }
}
private GameModel _game;
public MainViewModel()
{
_game = new GameModel();
_PlayerControlViewModel = new PlayerControlViewModel(_game);
_RegistrationViewModel = new RegistrationViewModel(_game);
}
}
}
运行程序后,绑定将失败并出现以下错误:
System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“MainViewModel”(HashCode=51295333)上找不到“Register”属性。绑定表达式:路径=注册; DataItem='MainViewModel' (HashCode=51295333);目标元素是 'Button' (Name='');目标属性是“命令”(类型“ICommand”) System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“MainViewModel”(HashCode=51295333)上找不到“RegisterViewModel”属性。绑定表达式:路径=注册视图模型; DataItem='MainViewModel' (HashCode=51295333);目标元素是 'Button' (Name='');目标属性是“DataContext”(类型“对象”) System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“MainViewModel”(HashCode=51295333)上找不到“RegisterViewModel”属性。绑定表达式:路径=注册视图模型; DataItem='MainViewModel' (HashCode=51295333);目标元素是'TextBox'(名称='');目标属性是“DataContext”(类型“对象”) System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“MainViewModel”(HashCode=51295333)上找不到“RegisterViewModel”属性。绑定表达式:路径=注册视图模型; DataItem='MainViewModel' (HashCode=51295333);目标元素是'TextBox'(名称='');目标属性是“DataContext”(类型“对象”) System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“MainViewModel”(HashCode=51295333)上找不到“RegisterViewModel”属性。绑定表达式:路径=注册视图模型; DataItem='MainViewModel' (HashCode=51295333);目标元素是'TextBox'(名称='');目标属性是“DataContext”(类型“对象”) System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“PlayerControlViewModel”(HashCode=65331996)上找不到“MovePlayer”属性。绑定表达式:路径=移动播放器; DataItem='PlayerControlViewModel' (HashCode=65331996);目标元素是 'Button' (Name='');目标属性是“命令”(类型“ICommand”) System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“PlayerControlViewModel”(HashCode=65331996)上找不到“MovePlayer”属性。绑定表达式:路径=移动播放器; DataItem='PlayerControlViewModel' (HashCode=65331996);目标元素是 'Button' (Name='');目标属性是“命令”(类型“ICommand”) System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“PlayerControlViewModel”(HashCode=65331996)上找不到“MovePlayer”属性。绑定表达式:路径=移动播放器; DataItem='PlayerControlViewModel' (HashCode=65331996);目标元素是 'Button' (Name='');目标属性是“命令”(类型“ICommand”) System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“PlayerControlViewModel”(HashCode=65331996)上找不到“MovePlayer”属性。绑定表达式:路径=移动播放器; DataItem='PlayerControlViewModel' (HashCode=65331996);目标元素是 'Button' (Name='');目标属性是“命令”(输入“ICommand”)
看起来,DataContext 无法通过MainViewModel 绑定到ViewModels。
【问题讨论】:
-
这很有趣,如果我在 MainWindow.xaml.cs 中设置 DataContext 而不是直接在 MainWindow.xaml
标记中,我会得到 MainViewModel 的属性未找到错误以及我的 PlayerControlViewModel 的属性未找到错误。 - 我认为设置 DataContext 的两种方法是相等的......:S -
最后的错误现在是基于拼写错误。但无论如何,我不明白在 xaml 或 xaml.cs 中看到 DataContext 之间有什么区别......
-
您是否尝试过公开您的课程?
标签: c# wpf xaml data-binding