视图的 DataContext 不应该为 null,因为您在视图的构造函数中设置了它。 否则显示您放置断点的位置,表明它为空。 Binding
Text="{Binding Username, Mode=TwoWay}"
不起作用,因为您在 UserControl“ClearableTextBox”构造函数中使用了反模式。
<User_Controls:ClearableTextBox Margin="5"
x:Name="txtUsername"
Placeholder="Username"
Text="{Binding Username, Mode=TwoWay}"/>
public ClearableTextBox()
{
DataContext = this;
InitializeComponent();
}
由于您在构造函数中将用户控件的 DataContext 设置为自身,因此它现在无法“继承”它所在视图的 DataContext。 您可以查看这个答案,其中显示了如何正确操作。
***编辑回复评论中的问题,无长度限制:
DataContext 是绑定的默认源。 因此,当您编写
Text="{Binding Placeholder}
时,相当于说“绑定到此控件的源 DataContext 上的属性 Placeholder”。现在,由于您在 UserControl 的构造函数中删除了 DataContext = this
,它现在继承了它所在视图的 DataContext (因此在您的示例中为 MyAccountViewModel )。
MyAccountViewModel 没有属性
Placeholder
,因此占位符为空(您的 IDE 输出中应该有一条消息)。
现在要解决此问题,您需要修复
Text="{Binding Placeholder}
,以便它使用您的 UserControl 作为源。要修复它,您可以使用我之前提到的答案。
这会给你一个像这样的绑定:
Text="{Binding Path=Placeholder RelativeSource={RelativeSource Self}}
或者
Text="{Binding Path=Placeholder ElementName=myClearableTextBox}
(最后一个,您必须在 xaml 中将 UserControl 命名为“myClearableTextBox”,如下所示:x:Name="myClearableTextBox"
)