DataBinding, обновить данные, если DataContext изменяется - PullRequest
2 голосов
/ 24 июля 2011

Мой код: XAML:

<Window x:Class="BindingTut.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <StackPanel>
            <TextBox Text="{Binding FirstName}"/>
            <Button Content="Button" Height="23" Name="button1" Width="75" Click="button1_Click" />
        </StackPanel>
    </Grid>
</Window>

Класс клиента:

public class Customer
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
}

Код позади:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    private int index = 0;
    public Customer Tmp;
    List<Customer> ar = new List<Customer>();

    public MainWindow()
    {
        InitializeComponent();
        ar.Add(new Customer { FirstName = "qwe", LastName = "rty" });
        ar.Add(new Customer { FirstName = "asd", LastName = "asd" });
        this.Tmp = ar[index];
        this.DataContext = this.Tmp;
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        this.Tmp = ar[++index];
        if (this.PropertyChanged != null)
        {
            this.PropertyChanged(this, new PropertyChangedEventArgs("Tmp"));
        }

    }

    public event PropertyChangedEventHandler PropertyChanged;

}

Поэтому, когда приложение загружается, все в порядке -текстовое поле показывает «qwe», но кнопка, которая должна загрузить второй объект клиента, не работает.Что я делаю не так?

Ответы [ 2 ]

1 голос
/ 24 июля 2011

Вы не меняете DataContext. Вы изменяете значение в свойстве, которое для DataContext установлено.

Вам не нужно Tmp свойство вообще. Просто измените DataContext в вашем обработчике событий, например ::100100

DataContext = ar[++index];
0 голосов
/ 24 июля 2011

Вам нужно сделать свойство Tmp, а затем привязать к нему DataContext, например:

private Customer tmp;    
public Customer Tmp {
    get {
        return this.tmp;
    }
    set {
        this.tmp = value;
        if (this.PropertyChanged != null)
            this.PropertyChanged(this, new PropertyChangedEventArgs("Tmp"));
    }
}

public MainWindow()
{
    InitializeComponent();
    ar.Add(new Customer { FirstName = "qwe", LastName = "rty" });
    ar.Add(new Customer { FirstName = "asd", LastName = "asd" });
    this.Tmp = ar[index];
    this.SetBinding(DataContextProperty, new Binding("Tmp") { Source = this });
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...