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>

WPF绑定错误40,但程序工作

<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对象。

相关文章: