Как вручную обновить привязку данных? - PullRequest
1 голос
/ 05 марта 2011

У меня большая модель данных на основе запросов, и я хочу отображать результаты запросов Linq в сетках. Графический интерфейс будет редактировать атрибуты, которые будут влиять на результат запроса. Однако, хотя привязка выполняется просто отлично, отладчик не показывает подписчика на событие PropertyChanged (оно равно «null»). Я сделал этот тестовый пример.

Я хочу, чтобы пользователь установил несколько критериев, а затем нажал кнопку «Выполнить». В моем примере я ожидал, что количество элементов в сетке изменится.

Вот xaml:

<Window x:Class="GridViewNotifyTest.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>
        <Button Click="Button_Click">Take 3</Button>
        <Button Click="Button_Click_1">Take 5</Button>
        <Button Click="Button_Click_2">FireNotify</Button>
    <DataGrid ItemsSource="{Binding}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding}"/>
        </DataGrid.Columns>            
    </DataGrid>
    </StackPanel>
</Grid>
</Window>

А вот и C #:

namespace GridViewNotifyTest
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window,INotifyPropertyChanged
{
    private int _takeAmount;

    public MainWindow()
    {
        InitializeComponent();
        _takeAmount = 4;
        DataContext = Amount;            
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        _takeAmount = 3;
    }

    private void Button_Click_1(object sender, RoutedEventArgs e)
    {
        _takeAmount = 5;
    }

    private void Button_Click_2(object sender, RoutedEventArgs e)
    {
        OnPropertyValueChanged("Amount");
    }

    protected virtual void OnPropertyValueChanged(string propertyName)
    {
        if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName));  // THE DEBUGGER SHOWS THE PROPERTYCHANGED DELEGATE AS NULL.
    }

    public IEnumerable<int> Amount
    {
        get { return Enumerable.Range(1,10).Take(_takeAmount); }            
    }

    public event PropertyChangedEventHandler PropertyChanged;        
}
}

Ответы [ 2 ]

2 голосов
/ 06 марта 2011

В зависимости от названия вопроса, быстрый ответ будет использовать BindingExpression.UpdateTarget метод.

1 голос
/ 05 марта 2011

Установите DataContext на this, а затем измените привязку на

<DataGrid ItemsSource="{Binding Amount}">
...