XAML 正在尝试学习WPF和MVVM,但遇到了DataContext问题[重复]

pbgvytdp  于 2023-09-28  发布在  其他
关注(0)|答案(1)|浏览(107)

此问题已在此处有答案

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;工作,但是我无法通过绑定来完成,因为数据上下文似乎为空

pkln4tw6

pkln4tw61#

视图的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。您可以检查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"

相关问题