WPF绑定错误40,但程序工作
本文关键字:程序 工作 绑定 错误 WPF | 更新日期: 2023-09-27 17:50:59
回答:基本上,我没有正确使用Caliburn Micro。使用ContentControl是绑定视图和模型的正确方法。更多信息:Caliburn。用户控制的微游戏效果好吗?
我使用WPF与Caliburn微框架。程序从GameViewModel.cs开始,它与GameView.xaml正确同步。
从GameViewModel.cs我创建了四个new PlayerViewModel()
,与PlayerView.xaml正确同步。在PlayerView。xaml我有几个绑定,一切都绑定正确,没有问题,更新正如预期和我想要的…
但在输出窗口,我得到各种错误,从PlayerView绑定不能绑定到GameViewModel.cs.
现在,很好,程序按预期工作,但所有这些错误让我足够担心,检查我做错了什么。请帮帮我,这是怎么回事?
(我的猜测是,它是Caliburn相关的,它试图绑定x:Name
在GameViewModel的东西,因为那是启动项目。如果我碰巧在标记上,我如何更改它以正确绑定?)
错误如下:
System.Windows.Data Error: 40 : BindingExpression path error: 'TransformScaleX' property not found on 'object' ''GameViewModel' (HashCode=24649639)'. BindingExpression:Path=TransformScaleX; DataItem='GameViewModel' (HashCode=24649639); target element is 'TextBlock' (Name='ScaleX'); target property is 'Text' (type 'String')
System.Windows.Data Error: 40 : BindingExpression path error: 'TransformScaleY' property not found on 'object' ''GameViewModel' (HashCode=24649639)'. BindingExpression:Path=TransformScaleY; DataItem='GameViewModel' (HashCode=24649639); target element is 'TextBlock' (Name='ScaleY'); target property is 'Text' (type 'String')
List继续了一段时间,其他属性也出现了同样的错误。代码如下,我删除了(看起来?)不相关的部分:
//This works fine
public class GameViewModel : PropertyChangedBase
{
private Game _model;
public GameViewModel() { _model = new Game(this); }
private PlayerViewModel _player1 = new PlayerViewModel("player1");
public PlayerViewModel Player1 { get { return _player1; } set { _player1 = value; NotifyOfPropertyChange("Player1"); } }
}
//This works fine too.
<UserControl>
<Grid Width="1280" Height="720" Background="Cyan">
<local:PlayerView cal:View.Model="{Binding Player1}" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,220,0,0"/>
</Grid>
</UserControl>
//Works fine
public class PlayerViewModel : PropertyChangedBase
{
private Player _model;
public PlayerViewModel(string name)
{
Username = name;
_model = new Player(this);
}
//NotifyOfPropertyChange is handled properly elsewhere
public string TransformScaleX { get; set; }
public string TransformScaleY { get; set; }
}
//All binds with no issues.
<UserControl>
<Grid Width="288" Height="55">
<TextBlock x:Name="ScaleX" Visibility="Hidden" Text="{Binding TransformScaleX}"/>
<TextBlock x:Name="ScaleY" Visibility="Hidden" Text="{Binding TransformScaleY}"/>
</Grid>
</UserControl>
<UserControl>
<Grid Width="1280" Height="720" Background="Cyan">
<ContentControl cal:View.Model="{Binding Player1}" cal:View.Content="PlayerView" HorizontalAlignment="Left" VerticalAlignment="Top" Margin="10,220,0,0"/>
</Grid>
</UserControl>
这个应该可以工作。基本上你会得到错误,因为它找不到属性TransformScaleY/TransformScaleX的路径。因为视图模型正在寻找要绑定到当前视图上的属性。这也与混合mvvm范式有关,视图模型优先/视图优先。你只需要知道你想让它如何与其他东西一起发挥作用。
第一个错误消息表明,你试图绑定到TransformScaleX
属性时,DataContext是GameViewModel而不是PlayerViewModel。属性TransformScaleX
的第二个错误信息显示了类似的情况。
尝试检查在这个问题中发布的第二个UserControl
。当您期望它是PlayerViewModel
时,它的DataContext
似乎是GameViewModel
对象。