Прежде всего, я должен сказать, что я абсолютно новичок в 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