我遇到了一个问题,试图在WPF中更新我的BoundData。显示了我的数据,但我的用户界面未对数据中的更改做出反应。

我有一个看起来像这样的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中,有许多我想在ListViewGridView中表示的MatchData对象。 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。

因此,不会触发任何事件,进度栏的值也不会更改。当我通过单击列标题之一刷新UI时,进度栏将显示正确的值。显然,我想让我的进度栏显示当前进度而不单击它。

我对XAML绑定不熟悉,希望我不会犯很多根本性的错误,因此,我对所有其他建议都持开放态度,以寻求更好地改进此代码的方法。我不太喜欢我在访问ListViewGridview构造的项目时受到的限制,但这是我发现的最好的表,可以通过单击列标题进行排序。

最佳答案

问题出在

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"));
        }
    }


一切运行正常。

关于c# - 如何正确使用DataBinding,InotifyPropertyChanged,ListViewGridView,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28375701/

10-11 20:59