В моем списке просмотра событие PropertyChanged никогда не вызывает перерисовку списка - PullRequest
0 голосов
/ 30 марта 2010

Прежде всего, я должен сказать, что я абсолютно новичок в WPF! Я думаю, что у меня проблема с привязками WPF или уведомлениями "PropertyChanged" ...

У меня есть этот XAML с TextBlock и listView

<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): получено событие PropertyChanged из ViewModelData (hash = 8442299) Предупреждение System.Windows.Data: 97: BindingExpression (hash = 17842833): GetValue на уровне 1 из ViewModelData (hash = 8442299) с использованием RuntimePropertyInfo (MyPendingTasks): список 1 (hash=63249743 Count=2) System.Windows.Data Warning: 76 : BindingExpression (hash=17842833): TransferValue - got raw value List 1 (hash = 63249743 Count = 2) Предупреждение System.Windows.Data: 85: BindingExpression (hash = 17842833): TransferValue - использование окончательного значения List`1 (hash = 63249743 Count = 2)

Но ничего о GridViewColumn. Каждый раз, когда происходит событие, вызывается мой метод получения списка, тем не менее, список не обновляется с новыми значениями. Где моя ошибка? Thankyou

Ответы [ 2 ]

1 голос
/ 12 апреля 2012

У меня такая же проблема. Из-за использования многих потоков я не могу использовать ObervableCollection<>. Мой обходной путь - использовать два приватных списка и переключаться между ними. Таким образом, экземпляр изменен и INotifyPropertyChanged работает. Но это не может быть правильным способом решения этой проблемы. Использование INotifyCollectionChanged немного сложнее, чем INotifyPropertyChanged.

0 голосов
/ 30 марта 2010

Пожалуйста, уточните ваши привязки. Два используют viewModelData.XXX, два используют XXX напрямую. Что такое DataContext?

И когда список связан, используйте ObservableCollection <>, а не List <>. Когда список связан, WPF ищет INotifyCollectionChanged (который List не реализует), а не INotifyPropertyChanged (ну, он может использовать его, но для самого списка, а не для элементов в списке).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...