우선, 저는 WPF를 처음 접하게되었습니다! 나는이 클래스가 뒤에 내 Listview에서 PropertyChanged 이벤트가 결코 다시 그려지는 목록을 트리거하지 않습니다.
내가 TextBlock의이 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>
을 가지고 ... 내가 WPF 바인딩 또는 "하여 PropertyChanged"통지에 문제가했다고 생각하는 는
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 필드에 바인딩 된 textblock이 업데이트되고 listview는 영향을받지 않습니다.System.Windows.Data 경고 : 91 : I는하여 PropertyChanged 이벤트리스트 뷰에 도달 한 것을 표시되는 출력 창 BindingExpression (해시 = 17,842,833) ViewModelData에서 얻은하여 PropertyChanged 이벤트 (해시 = 8,442,299) System.Windows. RuntimePropertyInfo (MyPendingTasks)를 사용하여 ViewModelData (hash = 8442299)에서 수준 1의 GetValue : List 1 (hash=63249743 Count=2) System.Windows.Data Warning: 76 : BindingExpression (hash=17842833): TransferValue - got raw value List
(해시 = 63249743 개수 = 2) System.Windows.Data 경고 : 85 : BindingExpression (해시 = 17842833) BindingExpression (hash = 17842833) : TransferValue - 최종 값 사용 List`1 (해시 = 63249743 개수 = 2)
GridViewColumn에 대해서는 아무 것도 없습니다. 목록 이벤트가 발생할 때마다 목록 getter가 호출되지만 listview는 새 값으로 업데이트되지 않습니다. 내 실수는 어디 갔지? 감사합니다.
내 응용 프로그램이 쓰레기이며 ObservableCollection을 사용하는 것이 거의 불가능했습니다 ... 그래서 내가 List에 가기로 결정한 것입니다. 이제는 INotifyCollectionChanged를 구현하려고 시도합니다. 알려 드리겠습니다. – damiano