尝试学习 WPF 和 MVVM,但遇到 DataContext 问题

问题描述 投票:0回答:1
c# wpf xaml mvvm data-binding
1个回答
0
投票

视图的 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"

© www.soinside.com 2019 - 2024. All rights reserved.