在 UserControl 中绑定文本框

Bind Textbox in UserControl

我的看法

<UserControl x:Class="Views.PartView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:viewModels="clr-namespace:EComponents.ViewModels"
             mc:Ignorable="d" 
             x:Name="PartUc"
             d:DataContext="{d:DesignInstance viewModels:PartViewModel}">        
        <Grid>
            <TextBox x:Name="NameTb" Text="{Binding Name}" />
       </Grid>
</UserControl>

我的视图模型

public class PartViewModel : ViewModel<Part>
{
    public PartViewModel(Part model) : base(model)
    {
        PartListViewModel.OnSelectedPartChanged += PartListViewModel_OnSelectedPartChanged;
    }    
    void PartListViewModel_OnSelectedPartChanged(Part p)
    {
        Model = Part.GetPart(p);
    }      
    public string Name
    {
        get
        {
            return Model.Name;
        }
        set
        {
            if (Name != value)
            {
                Model.Name = value;
                this.OnPropertyChanged("Name");
            }
        }
    }   
}

我的模型

public class Part
{
    public string Name { get; set; }
}

我不知道为什么,但我的 UserControl 中的文本框没有填充我的部分的名称 属性,即使这行被调用

Model = Part.GetPart(p);

我这样设置视图的数据内容

public partial class PartView : UserControl
{
    public PartView()
    {
        InitializeComponent();
        DataContext = new PartViewModel(new Part());
    }
}

您的代码中有一个小问题:

        if (Name != value)
        {
            Model.Name = value;
            this.OnPropertyChanged("Name");
        }

应该是:

        if (Model.Name != value)
        {
            Model.Name = value;
            this.OnPropertyChanged("Name");
        }

自引用视图模型的名称 属性 会给您带来问题。

最后但同样重要的是,您需要代码隐藏中的代码在运行时绑定 DataContext。

编辑

我刚刚又看了一遍你的代码以及问题的评论。当您在事件处理程序中设置 Model 的值时,您还需要在那里设置 DataContext。更改模型引用不会更新 DataContext。

ModelPartListViewModel_OnSelectedPartChanged 中更改时,您似乎没有通知 UI。您需要在更改后为每个 Model 相关的 属性 调用 this.OnPropertyChanged(...) 或使用空参数 this.OnPropertyChanged(null) 调用它以刷新所有属性

void PartListViewModel_OnSelectedPartChanged(Part p)
{
    Model = Part.GetPart(p);
    this.OnPropertyChanged(null);
}