WPF - 绑定问题

时间:2010-12-21 08:26:30

标签: wpf binding

为什么单击按钮后文本块中的文本不会改变?

XAML:

 <Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>

    <TextBlock Text="{Binding Name}"/>
    <Button Click="Button_Click" Grid.Row="1" Margin="20">Click Me</Button>
</Grid>

代码背后:

  public partial class Window1 : Window, INotifyPropertyChanged
{
    private Person _myPerson;
    public Person MyPerson
    {
        get { return _myPerson; }
        set
        {
            _myPerson = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("MyPerson"));
            }
        }
    }

    public Window1()
    {
        MyPerson = new Person { Name = "A" };
        DataContext = MyPerson;
        InitializeComponent();
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        MyPerson = new Person { Name = "B" };
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

3 个答案:

答案 0 :(得分:1)

<TextBlock Text="{Binding Name}"/>

在上面的代码中,您可以使用文本框和以下代码绑定属性Name

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyPerson = new Person { Name = "B" };
}

您将MyPerson设置为新人。

这是打算的吗? Person类是否会实现INotifyPropertyChanged事件?

您只是更新MyPerson属性。 DataContext仍然使用以下行引用您创建的对象:

MyPerson = new Person { Name = "A" };

在构造函数中。您还需要更新DataContext

相反,请使用以下代码:

private void Button_Click(object sender, RoutedEventArgs e)
{
    MyPerson = new Person { Name = "B" };
    DataContext = MyPerson;
}    

答案 1 :(得分:1)

更改

<TextBlock Text="{Binding Name}"/>

<TextBlock Text="{Binding MyPerson, Path=Name}"/>

由于您绑定了Name,因此当您更改MyPerson并且视图不会更新时,NotifyPropertyChanged将不会在Name上触发。

答案 2 :(得分:0)

你需要在Person类上实现INotifyPropertyChanged,然后只需更改MyPerson的名称来提升PropertyChanged,如果你想要它更清洁......

或者您可以将您创建的新创建的对象重新应用于DataContext,否则它将无效