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

Xaml Prism MVVM绑定到用户控件依赖项属性,xaml,mvvm,user-controls,prism,dependency-properties,Xaml,Mvvm,User Controls,Prism,Dependency Properties,我正在编写一个通用应用程序,我想使用Prism和Unity作为我的MVVM框架。一切都很顺利,直到我看到一个视图,其中有多个相同用户控件的实例(一个自定义水印文本框)。由于某种原因,我一直未能找到解决我问题的好办法。我想我忽略了什么,有一个直截了当的答案 这是我的源代码(只是相关部分)。在实现Prism之前,我有过一些背景知识。附加到用户控件的命令按预期启动,但我不知道如何操作控件本身): 任何关于如何使用Prism的用户控件或如何使用Prism绑定到依赖项属性的指导都将非常有用。谢谢 我的看法

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