Xaml Prism MVVM绑定到用户控件依赖项属性
我正在编写一个通用应用程序,我想使用Prism和Unity作为我的MVVM框架。一切都很顺利,直到我看到一个视图,其中有多个相同用户控件的实例(一个自定义水印文本框)。由于某种原因,我一直未能找到解决我问题的好办法。我想我忽略了什么,有一个直截了当的答案 这是我的源代码(只是相关部分)。在实现Prism之前,我有过一些背景知识。附加到用户控件的命令按预期启动,但我不知道如何操作控件本身): 任何关于如何使用Prism的用户控件或如何使用Prism绑定到依赖项属性的指导都将非常有用。谢谢 我的看法Xaml Prism MVVM绑定到用户控件依赖项属性,xaml,mvvm,user-controls,prism,dependency-properties,Xaml,Mvvm,User Controls,Prism,Dependency Properties,我正在编写一个通用应用程序,我想使用Prism和Unity作为我的MVVM框架。一切都很顺利,直到我看到一个视图,其中有多个相同用户控件的实例(一个自定义水印文本框)。由于某种原因,我一直未能找到解决我问题的好办法。我想我忽略了什么,有一个直截了当的答案 这是我的源代码(只是相关部分)。在实现Prism之前,我有过一些背景知识。附加到用户控件的命令按预期启动,但我不知道如何操作控件本身): 任何关于如何使用Prism的用户控件或如何使用Prism绑定到依赖项属性的指导都将非常有用。谢谢 我的看法
在尝试直接绑定属性时,从您的注释/错误消息(“未能分配给属性%0”)可以看出,您尝试绑定到的属性不是依赖性属性 您的
水印文本框
仅实现CLR属性,如下所示:
公共类水印文本框:文本框{
公共对象水印{get;set;}
}
这不能用于数据绑定
您需要将其实现为依赖属性,如
公共类水印文本框:文本框{
公共对象水印
{
获取{return(object)GetValue(WatermarkProperty);}
set{SetValue(水印属性,值);}
}
公共静态只读从属属性WatermarkProperty=
DependencyProperty.Register(“水印”、typeof(对象)、typeof(WatermarkTextbox)、new PropertyMetadata(null));
}
这将允许使用
在控件上操作什么?从你的问题来看,你不清楚你想要实现什么,这使得你很难给出准确的答案answer@Tseng,如果我不清楚,我道歉。我想操纵水印文本框上的文本。自定义水印文本框仅由普通Xaml文本框组成。当用户导航到视图时,我希望显示水印文本(默认文本),当他们将焦点交给控件时,我希望删除水印文本,以便他们可以开始键入。一旦他们在字段中输入完毕,我需要访问他们在每个字段中输入的内容。问题是,既然您已经可以直接绑定文本框,为什么还要将文本框内容传递给命令?Prism没有特殊的绑定方式,它是普通的MVVM+WPF绑定,Prism没有改变绑定的工作方式。所以当我尝试绑定依赖属性时,会有什么问题?我得到错误:“未能分配到属性%0”,因此我不知道如何绑定到依赖属性。您没有WatermarkTextBoxViewModel,是吗?
<!-- I want to be able to set the watermark and also retrieve the text from my ViewModel -->
<uc:WatermarkTextBox Width="250"
x:Name="FullName">
<i:Interaction.Behaviors>
<iCore:EventTriggerBehavior EventName="GotFocus">
<iCore:InvokeCommandAction Command="{Binding EntryFieldFocus}"
CommandParameter="{Binding ElementName=FullName}"/>
</iCore:EventTriggerBehavior>
</i:Interaction.Behaviors>
</uc:WatermarkTextBox>
<!-- This one as well -->
<uc:WatermarkTextBox Width="250"
x:Name="EmailAddress">
<i:Interaction.Behaviors>
<iCore:EventTriggerBehavior EventName="GotFocus">
<iCore:InvokeCommandAction Command="{Binding EntryFieldFocus}"
CommandParameter="{Binding ElementName=EmailAddress}" />
</iCore:EventTriggerBehavior>
</i:Interaction.Behaviors>
</uc:WatermarkTextBox>