Data binding 如何绑定控件属性?

Data binding 如何绑定控件属性?,data-binding,mvvm,windows-runtime,caliburn.micro,caliburn,Data Binding,Mvvm,Windows Runtime,Caliburn.micro,Caliburn,我使用Caliburn.Micro基于约定的绑定,但我有一个小问题: 如何设置绑定应绑定到的属性?如果使用x:Name=“SomeProperty”创建控件,如何选择SomeProperty的值是否应绑定到控件的value属性、控件的OnClick事件或其他不同的内容,如内容或标记属性 示例:我有一个HyperlinkButton,我想绑定到一个特定的URL,我想将OnClick绑定到我的ViewModel中的事件处理程序 <HyperlinkButton x:Name="BookDeta

我使用Caliburn.Micro基于约定的绑定,但我有一个小问题:

如何设置绑定应绑定到的属性?如果使用
x:Name=“SomeProperty”
创建控件,如何选择
SomeProperty
的值是否应绑定到控件的
value
属性、控件的
OnClick
事件或其他不同的内容,如
内容
标记
属性

示例:我有一个
HyperlinkButton
,我想绑定到一个特定的URL,我想将
OnClick
绑定到我的ViewModel中的事件处理程序

<HyperlinkButton x:Name="BookDetailsViewModel_InfoLink" Content="Read more" />

但是,Content属性不是用
阅读更多内容
填充的,而是用URL的值填充的。在本例中,我如何:

  • 将导航URI设置为my ViewModel属性中URL的值
  • 将内容设置为“阅读更多”
  • 在my ViewModel中指定将处理单击的事件处理程序

有人能帮我吗?

您可以按CM中的每个元素类型自定义ConventionManager。默认的开箱即用实现应用于任何没有明确定制的元素

要添加新约定,只需调用ConventionManager.AddElementConvention

方法如下所示(来自CM源)

但最好还是走大会路线:)

编辑:

可能会添加如何获取约定以从超链接获取属性值-

<HyperlinkButton x:Name="SomeLink" Content="Read more..." cal:Message.Attach="HyperlinkClicked(SomeLink)" />

默认情况下,上述操作会将文本框的
Text
属性传递给
HyperlinkClicked
方法。

您是说要自定义此控件的约定,以便它执行您想要的操作,还是说您在使用或不使用约定时遇到问题?我的假设是,你希望公约为你做这一切我只是想让它工作,我真的不在乎它是否与公约一起工作。一些显式绑定代码对我来说很好,但是当我使用{binding SomeProperty}时,它就不起作用了。添加了关于如何基于约定和显式地进行绑定的解释。让我知道该帮助是否尝试了显式解决方案,并且它到达了我的viewmodel的事件处理程序,但参数为空。我的方法如下所示:
public void HyperlinkClicked(EventArgs args)
我是否在此处传递了错误类型的参数?我不知道它应该接受哪种类型的参数(如何知道这些事情?)。CM不使用
EventArgs
-它使用属性的类型。如果进入代码隐藏并声明HyperlinkButton,查看
NavigateURI
属性是什么类型(可能是字符串?还是URI?),并将其用作参数类型。如果有疑问,请将方法上的类型设置为
对象
,并将其断点-请参阅类型参数作为CM传递。CM会将null传递给它不能与提供的匹配的参数,因此它不应该抛出异常,但无论如何它都会调用该方法。我猜,
public-void-HyperlinkClicked(字符串uri)
会起作用。(好吧,我撒谎了,文档说它的System.Uri)嗯,我的超链接绑定到一个字符串,但是我得到了
null
偶数时间,即使我将参数设置为对象。这是我的XAML:
NavigateUri-CAPS on
URI
应该是
URI
我的坏。属性解析器区分大小写,因为c#区分大小写。正如我所说,使用约定可能更好,因为它可以帮助避免这些小错误,因为在设计时没有任何东西可以检查这些错误。哦,是的,仅仅因为
NavigateUri
绑定到字符串,并不意味着属性将是字符串-WPF/RT/SL中有一种称为
TypeConverters
的东西,它将传入的值转换为所需的类型,因此,NavigateUri的转换器解析绑定字符串并将其转换为
System.Uri
。这里有一些关于
类型转换器的有用信息,以防您决定编写自己的控件,甚至
用户控件
…-当您希望通过XAML标记向自定义控件提供值时,它非常有用
ConventionManager.AddElementConvention<HyperlinkButton>(HyperlinkButton.NavigateUri, "NavigateUri", "Click");
<HyperlinkButton Content="Read more..." NavigationURI="{Binding SomeUri}" cal:Message.Attach="[Event Click] = [Action HyperlinkClicked($this.NavigateUri)" />
<HyperlinkButton x:Name="SomeLink" Content="Read more..." cal:Message.Attach="HyperlinkClicked(SomeLink)" />
<TextBox x:Name="SomeTextBox" />
<HyperlinkButton x:Name="SomeLink" Content="Read more..." cal:Message.Attach="HyperlinkClicked(SomeTextBox)" />