2010-03-30 4 views
0

우선, 저는 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는 새 값으로 업데이트되지 않습니다. 내 실수는 어디 갔지? 감사합니다.

답변

0

구속력을 명확히하십시오. 두 개는 viewModelData.XXX를 사용하고 두 개는 XXX를 직접 사용합니다. DataContext 무엇입니까?

목록이 바인딩 된 경우 목록 <>이 아닌 ObservableCollection <>을 사용하십시오. 목록이 바인딩되면 WPF는 INotifyPropertyChanged가 아니라 INotifyCollectionChanged (List가 구현하지 않음)를 찾습니다 (글쎄, 사용할 수 있지만 목록의 항목이 아니라 목록 자체의 경우).

+0

내 응용 프로그램이 쓰레기이며 ObservableCollection을 사용하는 것이 거의 불가능했습니다 ... 그래서 내가 List에 가기로 결정한 것입니다. 이제는 INotifyCollectionChanged를 구현하려고 시도합니다. 알려 드리겠습니다. – damiano

1

동일한 문제가 있습니다. 많은 쓰레드를 사용하기 때문에 ObervableCollection<>을 사용할 수 없습니다. 제 해결 방법은 두 개의 개인 목록을 사용하고 그 사이에서 변경하는 것입니다. 따라서 인스턴스가 변경되고 INotifyPropertyChanged이 작동합니다. 그러나 이것이이 문제를 해결하는 올바른 방법이 될 수는 없습니다. INotifyCollectionChanged을 사용하면 INotifyPropertyChanged이 조금 더 어렵습니다.

관련 문제