此问题已在此处有答案:
Issue with DependencyProperty binding(3个答案)
关闭7天前。
Full Code
嗨,我试图在MyAccountView中获取此文本框
<User_Controls:ClearableTextBox Margin="5"
x:Name="txtUsername"
Placeholder="Username"
Text="{Binding Username, Mode=TwoWay}"/>
显示VM中当前登录的用户集
private string originalUsername;
private string username;
public string Username
{
get { return username; }
set
{
if (username != value)
{
username = value;
OnPropertyChanged(nameof(Username));
}
}
}
public MyAccountViewModel()
{
originalUsername = App.CurrentUser;
Username = originalUsername;
}
但是,当我进入调试时,视图中的数据上下文显示为空
public MyAccountView()
{
InitializeComponent();
DataContext = new MyAccountViewModel();
}
我已经成功地替换了文本与。文本属性在这个自定义tb在登录,但当我试图这样做,在这里它什么也没做
这是一个课程项目,我需要做的最后一个月,所以任何帮助是深深的appreciated!
ps-如果要测试,用户密码设置为12345
设置txtUsername.Text = App.CurrentUser;
工作,但是我无法通过绑定来完成,因为数据上下文似乎为空
1条答案
按热度按时间pkln4tw61#
视图的DataContext不应该为null,因为您在视图的构造函数中设置了它。否则,显示断点的位置,以表明它为空。Binding
Text="{Binding Username, Mode=TwoWay}"
不工作,因为您正在UserControl“ClearableTextBox”构造函数中使用反模式。由于您在构造函数中将用户控件的DataContext设置为自身,因此它现在不能“继承”它所在视图的DataContext。您可以检查this answer,它显示了如何以正确的方式执行此操作。
DataContext是Binding的默认源。因此,当您编写
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"
)