【问题标题】:WPF trying to bind model too early?WPF 试图过早地绑定模型?
【发布时间】:2011-07-11 10:57:45
【问题描述】:

使用 WPF 和 Prism。

我有一个视图,包含 1 个文本块

<UserControl x:Class="ArmoryModule.Views.ResultsView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:Views="clr-namespace:ArmoryModule.Views" xmlns:vmdc="clr-namespace:ArmoryModule.ViewModels"
             mc:Ignorable="d">

    <UserControl.DataContext>
        <vmdc:ResultsViewModel />
    </UserControl.DataContext>

    <Grid>
        <TextBlock Text="{Binding Name, UpdateSourceTrigger=PropertyChanged}" />
    </Grid>
</UserControl>

正在尝试绑定到下面ResultsViewModel 的相关部分

class ResultsViewModel : ViewModel
{
    private Character _character;

    public Character Character
    {
        get { return _character; }
        set
        {
            if (_character != value)
            {
                _character = value;
                RaisePropertyChanged(() => Name);
            }
        }
    }

    public string Name
    {
        get { return _character.Name; }
    }
}

构建良好,启动时中断。我在

上收到未发送到对象错误实例的对象引用
get { return _character.Name; }

我知道启动时没有填充字符,这就是我收到上述错误的原因。我有点不知道在哪里创建 Character 以便我拥有的 2 个视图模型可以使用它。

【问题讨论】:

  • 只是为了清楚。通过您的设置,如果您有执行 ViewModel.Character.Name = "new name" 的代码,它不会触发属性更改通知并更新 UI。这可能不是您需要做的事情,只是预料到您可能会给自己造成一些混乱。

标签: c# wpf oop data-binding prism


【解决方案1】:

要么将其添加到视图模型的构造函数中

public ResultsViewModel()
{
    _character = new Character();
}

或者只是在 getter 中添加一个检查,例如

get
{
    return _character != null ? _character.Name : string.empty;
}

【讨论】:

  • 应该是后者,真的,因为没有什么可以阻止消费者稍后将Character 属性设置为null
【解决方案2】:

呸。

public string Name
{
    get { return _character == null ? string.Empty : _character.Name; }
}

【讨论】:

  • 实际上,downvoter,这完全解决了问题。它称为空值检查,无论您是否绑定都应该进行。尼亚。
猜你喜欢
  • 2023-03-06
  • 2011-10-07
  • 2017-02-15
  • 1970-01-01
  • 2019-12-24
  • 1970-01-01
  • 2011-02-22
  • 1970-01-01
  • 2012-09-29
相关资源
最近更新 更多