2015-02-06 2 views
2

У меня возникла проблема с попыткой получить мою BoundData, обновленную в WPF. Мои данные отображаются, но мой пользовательский интерфейс не реагирует на изменения данных.Как правильно использовать DataBinding, INotifyPropertyChanged, ListViewGridView

У меня есть XAML класс вида:

<Window x:Class="CSharpBoiler.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:util="clr-namespace:Wpf.Util" 
    Title="MainWindow" Loaded="Window_Loaded" Closing="Window_Closing" Height="Auto" Width="Auto" 
    DataContext="{Binding matchDataList, RelativeSource={RelativeSource Self}}"> 

<Grid> 
    <ListView 
    IsSynchronizedWithCurrentItem="True" 
    util:GridViewSort.AutoSort="True" 
    x:Name="MainListView" > 
     <ListView.View> 
      <GridView x:Name="MainGridView"> 
       <GridView.Columns> 
        <GridViewColumn Header="Demo, press to Download" 
          util:GridViewSort.PropertyName="Demo" 
          x:Name="DemoGridViewColumn"> 
         <GridViewColumn.CellTemplate> 
          <DataTemplate> 
           <DockPanel> 
            <ProgressBar x:Name="DemoButtonProgressbar" 
            Maximum="100" Minimum="0" 
            Value="{Binding AnalysisProgress, 
            UpdateSourceTrigger=PropertyChanged}" Width="100"/> 
           </DockPanel> 
          </DataTemplate> 
         </GridViewColumn.CellTemplate> 
        </GridViewColumn> 
       </GridView.Columns> 
      </GridView> 
     </ListView.View> 
    </ListView> 
</Grid> 

MyMainWindow выглядит следующим образом:

public partial class MainWindow : Window 
{ 
    private List<MatchData> matchDataList = new List<MatchData>(); 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 
     MainListView.ItemsSource = matchDataList; 
    } 

В matchDataList ряд объектов MatchData, которые я хочу представить в мой ListViewGridView. MatchData выглядит следующим образом:

public class MatchData : ObservableCollection<MatchData>, INotifyPropertyChanged 
{ 
    public int _AnalysisProgress; 
    public int AnalysisProgress 
    { 
     get { return _AnalysisProgress; } 
     set 
     { 
      _AnalysisProgress = value; 
      NotifyPropertyChanged("AnalysisProgress"); 
     } 
    } 

    public PropertyChangedEventHandler PropertyChanged; 

    public void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 

} 

На данный момент мой Progressbar отображается в моей ListGridViewgridView конструкции. Я изменяю значение этого в моем коде, чтобы показать прогресс. При изменении значения AnalysisProgress NotifyPropertyChanged вызывается правильно. Но PropertyChanged всегда имеет значение null.

Поэтому никакое событие не запускается, и значение Progressbar не изменяется. Когда я обновляю пользовательский интерфейс, нажав на один из заголовков столбцов, Progressbar показывает правильное значение. Очевидно, я хочу, чтобы мой Progressbar показывал текущий прогресс, не нажимая на него.

Я безмолвно знаком с XAML Binding и надеюсь, что я не сделал много основополагающих ошибок, поэтому я полностью открыт для всех других предложений в том, как сделать этот код лучше. Мне не очень нравится, как я ограничен в доступе к элементам конструкции ListViewGridview, но это лучшая таблица, которую я нашел, которая сортирует, нажимая на заголовки столбцов.

Image of the Running Programm, Progressbar is to the right of the Analyse Button

+0

Попробуйте изменить список на ObservableCollection. ObservableCollection matchDataList = new ObservableCollection () –

+0

@Ganesh изменил его, PropertyChanged по-прежнему равен нулю, и пользовательский интерфейс не обновляется. – Master117

+0

В вашей привязке есть некоторые проблемы. –

ответ

0

Проблема была в

public class MatchData : ObservableCollection<MatchData>, INotifyPropertyChanged 

после изменения его

public class MatchData : INotifyPropertyChanged 

VS предложил мне реализовать интерфейс, после этого и фиксации

public PropertyChangedEventHandler PropertyChanged; 

public void NotifyPropertyChanged(string propertyName) 
{ 
    if (PropertyChanged != null) 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
} 

к

 public event PropertyChangedEventHandler PropertyChanged; 

    public void OnPropertyChanged(PropertyChangedEventArgs e) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, e); 
     } 
    } 

и

public int _AnalysisProgress; 
public int AnalysisProgress 
{ 
    get { return _AnalysisProgress; } 
    set 
    { 
     _AnalysisProgress = value; 
     NotifyPropertyChanged("AnalysisProgress"); 
    } 
} 

в

 public int _AnalysisProgress { get; set; } 
    public int AnalysisProgress 
    { 
     get { return _AnalysisProgress; } 
     set 
     { 
      _AnalysisProgress = value; 
      OnPropertyChanged(new PropertyChangedEventArgs("AnalysisProgress")); 
     } 
    } 

Все работает как надо.

+0

Единственное, что изменилось здесь: добавлено событие 'event', как определено обработчиком событий в интерфейсе' INotifyPropertyChanged'. –

Смежные вопросы