У меня возникла проблема с попыткой получить мою 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, но это лучшая таблица, которую я нашел, которая сортирует, нажимая на заголовки столбцов.
Попробуйте изменить список на ObservableCollection. ObservableCollection matchDataList = new ObservableCollection () –
@Ganesh изменил его, PropertyChanged по-прежнему равен нулю, и пользовательский интерфейс не обновляется. – Master117
В вашей привязке есть некоторые проблемы. –