Prism MVVM绑定到用户控件依赖属性

时间:2015-03-21 21:39:15

标签: xaml mvvm user-controls prism dependency-properties

我有一个我正在编写的通用应用程序,我想使用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>

1 个答案:

答案 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。