2016-09-06 4 views
0
private ObservableCollection<classType>_colls; 
public ObservableCollection<classType> Colls 
{ 
    get {return _colls;} 
    set { _colls = value; OnPropertyChanged("Colls");} 
} 

public string _name; 
public string Name 
{ 
    get { return _name; } 
    set { _name= value; OnPropertyChanged("Name"); } 
} 

public string _Id; 
public string Id 
{ 
    get { return _Id; } 
    set { _Id= value; OnPropertyChanged("Id"); } 
} 

목록 컨트롤이 있고 ItemsSourceObservableCollection으로 바인딩되어 있습니다.WPF에서 목록을 새로 고치는 방법?

값을 편집 한 후에는 컬렉션이 새로 고쳐지지만보기의 속성은 변경되지 않습니다.

classType 2 개 특성 & IdName 포함하며 INotifyPropertyChanged을 연장한다. 그러나 Name 속성의 값은 View에서 영향을받지 않습니다.

viewmodels :

public class ViewModelBase : INotifyPropertyChanged 
{ 
    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

public class classType : ViewModelBase 
{ 
    public string _Name; 
    public string Name 
    { 
     get { return _Name; } 
     set { _Name = value; OnPropertyChanged("Name"); } 
    } 

    public string _Id; 
    public string Id 
    { 
     get { return _Id; } 
     set { _Id = value; OnPropertyChanged("Id"); } 
    } 
} 

XAML보기 : 아시다시피 뷰 모델이 적절하게 결합 될 때

<ListBox ItemsSource="{Binding Colls,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <StackPanel> 
     <TextBlock 
      ToolTip="{Binding Name, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" 
      TextTrimming="WordEllipsis" 
      Text="{Binding Path=Name, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 
     </StackPanel> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
+0

'updatesourcetrigger = propertychanged'를 (를) 보도록하십시오. 또한,'Twoway'로'Binding'을 설정했는지 확인하십시오. – Gopichandar

+0

예, 역시 그렇게했으나 작동하지 않았습니다. – Dinesh

+0

'ViewModel'의 코드와'DataContext'를 어떻게 할당했는지 보여주세요. – Gopichandar

답변

0

는, 데이터 바인딩 수동 새로 고침 명령을 필요로하지 않는다.

귀하의 자산이 classType 인 경우 PropertyChanges이 잘 발생하지만, 내부적으로 해고 된 이벤트는 외부로 알려주지 않습니다. 따라서 외부 이벤트 만 알면 변경 사항을 알 수없는 Listview입니다. 이 문제를 해결하려면 에 포함 된 속성 변경 내용을 CollectionChanged 이벤트로 버블 업해야합니다.

이렇게하려면 ObservableCollectionEx을 사용하는 것이 좋습니다.

  • Nuget 패키지 링크 :

https://www.nuget.org/packages/ObservableCollectionEx/ 패키지 위에 설치하고 바로 다음 뷰 모델 클래스의 모든 세트에 ObservableCollectionExObservableCollection를 교체합니다.

+2

ObservableCollection 사용 문제는 무엇입니까?목록에 바인딩 된 모음 (예 : 항목 추가/제거)이 수정되면 UI *가 업데이트됩니다. –

+0

@HadiEskandari // 설명을 업데이트합니다. – Youngjae

+1

동의하지 않습니다. 'classType'에는 이미'INotifyPropertyChanged'가 구현되어 있으며 트릭을해야합니다. ObservableCollection' 내부적으로 'Propertychanged'에 통지하기 위해 여기서 아무 것도하지 않습니다. 'CollectionChanged'에 대해서만 통지해야합니다. – Gopichandar

1

어디서 잘못되었는지 알 수 없습니다. 근본 원인을 찾으려면 전체 코드 (보기 및 뷰 모델 모두)가 필요합니다. 내가 직접 디버깅하는 데 도움이되는 코드를 기반으로하는 작업 샘플을 제공하겠습니다.

MainWindow.xaml

<Grid> 
    <ListBox ItemsSource="{Binding Colls,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock ToolTip="{Binding Name, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}" TextTrimming="WordEllipsis" Text="{Binding Path=Name, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 
    <Button Click="Button_Click" Width="100" Height="50" Content="Click Me" /> 
</Grid> 

MainWindow.xaml.cs를

public MainWindow() 
    { 
     InitializeComponent(); 
     Colls = new ObservableCollection<MyClass>(); 
     Colls.Add(new MyClass() 
     { 
      Id = "1", Name = "aaa" 
     }); 
     Colls.Add(new MyClass() 
     { 
      Id = "2", 
      Name = "bbb" 
     }); 
     Colls.Add(new MyClass() 
     { 
      Id = "3", 
      Name = "ccc" 
     }); 

     this.DataContext = this; 

    } 

    private ObservableCollection<MyClass> _colls; 
    public ObservableCollection<MyClass> Colls 
    { 
     get { return _colls; } 
     set { _colls = value; } 
    } 

    private int i = 1; 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     Colls[0].Name = "Value changed for " + i++ + " time(s)."; 
    } 

MyClass.cs

public class MyClass : INotifyPropertyChanged 
{  

    public string _name; 
    public string Name 
    { 
     get { return _name; } 
     set { _name = value; OnPropertyChanged("Name"); } 
    } 

    public string _Id; 
    public string Id 
    { 
     get { return _Id; } 
     set { _Id = value; OnPropertyChanged("Id"); } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
    public void OnPropertyChanged(string propname) 
    { 
     if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propname)); 
    } 
} 

호프 번째 도와 줘.

+0

'Colls' 속성은 읽기 전용이거나 INotifyPropertyChanged를 구현해야합니다. 그렇지 않으면 괜찮습니다. – Liero

+0

@Dinesh 코멘트에 코드를 게시하지 마십시오! 한 시간 전에이 사실을 통보받은 곳에서 당신은 여전히 ​​그것을 다시합니다 - – grek40

관련 문제