2015-08-28 172 views
1

任何人都可以解釋爲什麼我不能使用重置綁定數據?WPF綁定更新

使用MVVM,數據綁定到ListBox。

DataList已經實現了INotifyPropertyChanged。

在方法的OnChange()

public void OnChange() 
{ 
    data = new ObservableCollection<DataList>(); // not work 
    data.Add(new DataList() { Text = "Changed 1" }); 
    data.Add(new DataList() { Text = "Changed 2" }); 
} 

public void OnChange() 
{ 
    data.Clear(); // works fine 
    data.Add(new DataList() { Text = "Changed 1" }); 
    data.Add(new DataList() { Text = "Changed 2" }); 
} 

視圖模型

ObservableCollection<DataList> data; 
public ObservableCollection<DataList> Data 
{ 
    get { return data; } 
    set { data = value; } 
} 

public ViewModel() 
{ 
    this.Command_OnChange = new RelayCommand(ExecuteCommand1, CanExecuteCommand); 

    data = new ObservableCollection<DataList>(); 
    data.Add(new DataList() { Text = "Default 1" }); 
    data.Add(new DataList() { Text = "Default 2" }); 
} 

public void OnChange() 
{ 
    data.Add(new DataList() { Text = "Changed 1" }); 
    data.Add(new DataList() { Text = "Changed 2" }); 
} 

回答

1

因爲當你改變支持字段,也沒有辦法,WPF會知道關於變化。

事實上,您可以用ObservableCollection的新實例覆蓋變量,但是您也必須在ViewModel類中實現INotifyPropertyChanged

private ObservableCollection<DataList> data; 
public ObservableCollection<DataList> Data 
{ 
    get { return data; } 
    set 
    { 
     data = value; 
     OnPropertyChanged("Data"); 
    } 
} 

而在你的OnChange方法的快速反應

public void OnChange() 
{ 
    Data = new ObservableCollection<DataList>();//Note the use of Data property not field 
    Data.Add(new DataList() { Text = "Changed 1" }); 
    Data.Add(new DataList() { Text = "Changed 2" }); 
} 
+0

感謝。我可以通過直接修改數據來看到,它會觸發set和issue屬性更改爲View。在OnChange()方法中使用「數據」而不是「數據」可以嗎? – aicu

+0

@aicu。說實話,沒有理由在那裏創建新的'ObservableCollection';只需使用'data.Clear'就足夠了。如果你想完成的話,那麼你必須使用'OnPropertyChanged()'通知修改。但是,在那裏使用'Data'屬性是很好的。沒有任何錯誤。 –