【发布时间】:2013-09-16 18:46:52
【问题描述】:
我正在尝试理解这种模式及其背后的所有逻辑。
我认为这并不难,但我仍然在一些简单的任务上失败了。
让我们用我写的一个无效的例子来说明:
型号:
public class Model
{
public string Name { get; set; }
public string Description { get; set; }
public Categories Category { get; set; }
public Grid PresenterContent { get; set; }
}
视图模型:
public class ViewModel : ViewModelBase
{
private Model _model;
public Model Model
{
get
{
return _model;
}
set
{
if (_model != value)
{
_model = value;
RaisePropertyChanged(() => Model);
}
}
}
public Grid PresenterContent
{
get
{
return Model.PresenterContent;
}
private set { }
}
public ViewModel()
{
Model = new Model();
}
}
查看:
<UserControl.DataContext>
<Binding Source="ViewModel"/>
</UserControl.DataContext>
<Grid x:Name="LayoutRoot" Background="{StaticResource PhoneChromeBrush}">
<ContentPresenter Content="{Binding PresenterContent}"/>
</Grid>
现在,我希望它在运行时能够正常工作,因为我将 DataContext 设置为具有 PresenterContent 属性的 ViewModel。
(此属性在Model 和ViewModel 中,因为我不知道如何使用孩子的属性,在本例中为Model.PresenterContent。)
实际发生的是抛出异常:
System.Windows.Data 错误:BindingExpression 路径错误:在“ViewModel”“System.String”上找不到“PresenterContent”属性 (HashCode=-903444198)。 BindingExpression: Path='PresenterContent' DataItem='ViewModel' (HashCode=-903444198);目标元素是'System.Windows.Controls.ContentPresenter'(名称='');目标属性是“内容”(类型“System.Object”)..
这表示ViewModel 中没有PresenterContent,这显然是错误的。
如果我尝试绑定到Model 属性,则异常是相同的。
我做错了什么?
【问题讨论】:
-
老兄,你搞错了。您不应该在模型中放置
Grid类型的属性。这个想法是separateUI 和数据,而不是将它们更多地捆绑在一起。 -
忘记类型,这只是一个例子。正如我所写,即使
Model属性(甚至是我从代码中删除的字符串)也会出现错误。 -
我认为你还没有在你的用户控件资源中添加 ViewModel...在绑定中使用它之前你需要将它添加为用户控件资源
-
@StepTNT 即使这只是一个例子,你也应该听从 HighCore 的建议。这是 MVVM 的一个重要(基本......实际上是驱动因素之一)方面。我不想假设太多……但是对 MVVM 设计目标有深入了解的人可能不会在 VM 中使用 Grid 对象,即使在示例中也是如此。
标签: c# xaml mvvm windows-phone-8