【问题标题】:How to bind ItemsControl's ItemsSource property by using naming conventions in caliburn.micro correctly?如何正确使用 caliburn.micro 中的命名约定来绑定 ItemsControl 的 ItemsSource 属性?
【发布时间】:2020-07-27 07:29:07
【问题描述】:

视图中有一个名为 Items 的 ItemsControl,而 ViewModel 包含一个 BindableCollection<T> 属性 Items 属性,我希望它们通过使用 caliburn.micro 中的命名约定机制正确绑定,但是它不起作用正如预期的那样。

当我在视图中显式添加ItemsSource="{Binding Items}" 时,它起作用了,我想知道在 ItemsControl 中使用命名约定时遗漏了什么关键点?

【问题讨论】:

  • ItemsSource = "Items" 将字符串 "Items" 分配给 ItemsSource 集合,即项目将是这五个字符。目前尚不清楚您指的是哪种命名约定。您通常会在视图的 DataContext 对象(即视图模型)中有一个名为 Items 的公共属性,并将其绑定为 ItemsSource="{Binding Items}"
  • 我已经更新了描述。我刚刚在ConventionManager类的静态构造函数中找到了AddElementConvention<ItemsControl>(ItemsControl.ItemsSourceProperty, "DataContext", "Loaded"),我认为它会将ItemsControlItemsSource属性绑定到相同的属性在 ViewModel 中定义的名称。

标签: wpf naming-conventions caliburn.micro itemscontrol


【解决方案1】:

首先,使用“项目”一词作为属性、控件等的名称是一个不好的选择。这很令人困惑。如果有人在维护您的代码或阅读问题,这是正确的。您应该考虑事物的名称。

caliburn micro 的约定在这里解释:

https://caliburnmicro.com/documentation/conventions

本质上是检查一个控件。

名称用于从数据上下文中查找属性。

如果它们匹配,则该控件的依赖属性将被绑定。

使用的依赖属性因控件而异。 Text 是 TextBox 和 TextBlock 的默认值。 ItemsSource 是项目控件的默认值。

因此,您的问题的答案是您的控件名称应与属性名称匹配。

正如他们所看到的,这不是您的绑定失败的原因。

您还需要以某种方式提供该数据上下文的实例。

您证明了您的工作显式绑定正在发生这种情况。

因此,两个最可能的原因是:

您的引导程序没有运行 caliburn 微接线代码。

您的视图不是由引导程序提供的,您也没有在其上使用 viewmodel.bind 来连接所有内容。

您以某种方式干扰了默认绑定约定。

PS

https://caliburnmicro.com/announcements/stepping-away

【讨论】:

    猜你喜欢
    • 2020-01-13
    • 2011-10-04
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多