我有一个我正在编写的通用应用程序,我想使用Prism和Unity作为我的MVVM框架。一切都很顺利,直到我有一个视图,我有相同的用户控件的多个实例(自定义水印文本框)。出于某种原因,我还没能找到解决问题的好方法。我想我忽略了一些东西并且有一个直截了当的答案。
这是我的源代码(只是相关部分)。一些背景,我在实施Prism之前就已经开始工作了。附加到用户控件的命令按预期触发,但我无法弄清楚如何操作控件本身):
有关如何使用Prism的用户控件或使用Prism绑定依赖属性的任何指导都会很棒。感谢。
我的观点
<!-- 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>
答案 0 :(得分:0)
在尝试直接绑定属性时,从您的注释/错误消息(“无法分配给属性%0”)开始,您尝试绑定到的属性不是依赖项属性。
您的WatermarkTextBox
仅实现了CLR属性,如下所示:
public class WatermarkTextBox : TextBox {
public object Watermark { get; set; }
}
这不能用于数据绑定。
您需要将其实现为依赖属性,例如
public class WatermarkTextBox : TextBox {
public object Watermark
{
get { return (object)GetValue(WatermarkProperty); }
set { SetValue(WatermarkProperty, value); }
}
public static readonly DependencyProperty WatermarkProperty =
DependencyProperty.Register("Watermark", typeof(object), typeof(WatermarkTextbox), new PropertyMetadata(null));
}
这样可以使用<uc:WatermarkTextBox Watermark={Binding watermarkText, Mode=TwoWay}
。
如果您无法修改WatermarkTextBox
(第三方关闭源代码管理),那么您必须实现attached behavior,然后将ViewModel属性绑定到附加行为并分配{{来自其中的1}}属性。
如果你需要TwoWay绑定(在Watermark
属性的情况下不太可能,因为它不会从UI更改),你必须在链接的答案中注册一个事件处理程序(Watermark
)对此特定事件并将新值传递给附加属性
除了这两种方式之外,没有办法更新Control的CLR属性而不违反MVVM。