首先,我要管理员,我是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不会使用新值更新。 哪里是我的错? 三江源
答案 0 :(得分:1)
我有同样的问题。由于使用了很多线程,我无法使用ObervableCollection<>
。
我的解决方法是使用两个私有列表并在它之间进行更改。因此,实例已更改,INotifyPropertyChanged
正在运行。但这不是解决这个问题的正确方法。
使用INotifyCollectionChanged
比INotifyPropertyChanged
稍微困难一点。
答案 1 :(得分:0)
请澄清您的绑定。两个使用viewModelData.XXX,两个直接使用XXX。什么是DataContext?
当绑定列表时,使用ObservableCollection&lt;&gt;,而不是List&lt;&gt;。绑定列表时,WPF会查找INotifyCollectionChanged(List未实现),而不是INotifyPropertyChanged(嗯,它可以使用它,但是对于列表本身,而不是列表中的项目。)