在我的listview中,PropertyChanged事件永远不会触发重绘列表

时间:2010-03-30 13:56:35

标签: wpf binding

首先,我要管理员,我是WPF的新手! 我认为WPF Bindings或“PropertyChanged”通知存在问题......

我有一个带有TextBlock和listView

的XAML
<StackPanel Orientation="Horizontal">
                        <TextBlock Margin="2" Name="UpdatesOperationResultcaption" Text="Operation result:" FontSize="12" Foreground="SteelBlue" Grid.Column="1" Height="21" VerticalAlignment="Top" TextAlignment="Left" />
                        <TextBlock Margin="2" Name="UpdatesOperationResult" Text="{Binding Path=viewModelData.UploadProgressText}" FontSize="12" Foreground="SteelBlue" Grid.Column="1" Height="21" VerticalAlignment="Top" TextAlignment="Left" Width="134.431" />
                    </StackPanel>
                    <ListView Grid.Column="1" Margin="1" ItemsSource="{Binding Path= viewModelData.MyPendingTasks, diag:PresentationTraceSources.TraceLevel=High}" Name="TasksListView" SelectionMode="Multiple" BorderThickness="1" FontSize="11" Height="110" SelectionChanged="TasksListView_SelectionChanged">
                        <ListView.View>
                            <GridView>
                                <GridViewColumn Header="Task to execute" Width="350" DisplayMemberBinding="{Binding Path=taskFriendlyName,Converter={StaticResource debugConverter}, diag:PresentationTraceSources.TraceLevel=High}" />
                                <GridViewColumn Header="Value" Width="60" DisplayMemberBinding="{Binding Path=taskValuetoShow}" />
                            </GridView>
                        </ListView.View>
                    </ListView>

然后在后面的代码中我有这个类应该管理要显示的数据......

public class ViewModelData : INotifyPropertyChanged
{
    int dummy = 0;
    private string uploadProgressString;
    private List<TaskToAccomplish> myPendingTasks = new List<TaskToAccomplish>();

    public ViewModelData()
    {
        uploadProgressString = "0 %";
        TaskToAccomplish tempTask = new TaskToAccomplish("TEST", "99 %", 0, "dummy", "dummy");
        myPendingTasks.Add(tempTask);
        tempTask = new TaskToAccomplish("TEST2", "100 %", 0, "dummy", "dummy");
        myPendingTasks.Add(tempTask);
    }

    public string UploadProgressText
    {
        get
        {
            return this.uploadProgressString;
        }
        set
        {
            if (value != this.uploadProgressString)
            {
                this.uploadProgressString = value;
                NotifyPropertyChanged("UploadProgressText");
            }
        }
    }

    public List<TaskToAccomplish> MyPendingTasks
    {
        get
        {
            return myPendingTasks;
        }
        set
        {
            myPendingTasks.Clear();
            foreach (TaskToAccomplish task in value)
            {
                myPendingTasks.Add(task);
            }

            NotifyPropertyChanged("MyPendingTasks");
            NotifyPropertyChanged("taskFriendlyName");
            NotifyPropertyChanged("taskValuetoShow");


            uploadProgressString = dummy.ToString();
            NotifyPropertyChanged("UploadProgressText");
            dummy++;

        }
    }

    protected void NotifyPropertyChanged(String propertyName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    public event PropertyChangedEventHandler PropertyChanged;
}

这是我的情况:在类构造函数中,我放了几个假项目只是为了在屏幕上显示某些内容(并可能调试绑定)。在启动时一切都很好。当我更新我的数据时,为列表设置一个新值,绑定到uploadProgressString字段的文本块会更新,而列表视图不受影响。 在输出窗口中,我看到PropertyChanged事件到达ListView:

System.Windows.Data警告:91:BindingExpression(hash = 17842833):从ViewModelData获取PropertyChanged事件(hash = 8442299) System.Windows.Data警告:97:BindingExpression(hash = 17842833):使用RuntimePropertyInfo(MyPendingTasks)从ViewModelData(hash = 8442299)获取第1级的GetValue:列表1 (hash=63249743 Count=2) System.Windows.Data Warning: 76 : BindingExpression (hash=17842833): TransferValue - got raw value List 1(哈希= 63249743计数= 2) System.Windows.Data警告:85:BindingExpression(hash = 17842833):TransferValue - 使用最终值List`1(hash = 63249743 Count = 2)

但没有关于GridViewColumn。 每次上升事件时我都会调用list getter,但是listview不会使用新值更新。 哪里是我的错? 三江源

2 个答案:

答案 0 :(得分:1)

我有同样的问题。由于使用了很多线程,我无法使用ObervableCollection<>。 我的解决方法是使用两个私有列表并在它之间进行更改。因此,实例已更改,INotifyPropertyChanged正在运行。但这不是解决这个问题的正确方法。 使用INotifyCollectionChangedINotifyPropertyChanged稍微困难一点。

答案 1 :(得分:0)

请澄清您的绑定。两个使用viewModelData.XXX,两个直接使用XXX。什么是DataContext?

当绑定列表时,使用ObservableCollection&lt;&gt;,而不是List&lt;&gt;。绑定列表时,WPF会查找INotifyCollectionChanged(List未实现),而不是INotifyPropertyChanged(嗯,它可以使用它,但是对于列表本身,而不是列表中的项目。)