在UserControl中绑定文本框

时间:2015-01-14 16:22:01

标签: c# wpf xaml mvvm

我的观点

<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>

我的ViewModel

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中的TextBox没有填充我的部分的Name属性,即使这行被调用

Model = Part.GetPart(p);

我像这样设置了我的View的DataContent

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

2 个答案:

答案 0 :(得分:2)

Model中更改PartListViewModel_OnSelectedPartChanged后,好像您没有通知用户界面。更改后,您需要为每个this.OnPropertyChanged(...)相关属性调用Model,或使用空参数this.OnPropertyChanged(null)调用它以刷新所有属性

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

答案 1 :(得分:0)

您的代码中存在轻微问题:

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

应该是:

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

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

最后但并非最不重要的是,您需要在代码隐藏中使用代码来在运行时绑定DataContext。

修改

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