我有一個具有許多屬性的Activity
對象。其中之一是:使用MVVM的WPF組合框的雙向綁定問題
public ActivityStatus Status
{
get { return status; }
set { status = value; NotifyPropertyChanged("Status"); }
}
的ActivityStatus
類只有兩個屬性:
public Guid Guid
{
get { return guid; }
set { guid = value; NotifyPropertyChanged("Guid"); }
}
public string Name
{
get { return name; }
set { name = value; NotifyPropertyChanged("Name"); }
}
和Equals
方法:
public override bool Equals(object otherObject)
{
if (!(otherObject is ActivityStatus)) return false;
return Equals(otherObject as ActivityStatus);
}
public bool Equals(ActivityStatus otherStatus)
{
if (!(otherStatus is ActivityStatus) || otherStatus == null) return false;
return Guid == otherStatus.Guid && Name == otherStatus.Name;
}
我有一個ActivityViewModel
類爲一體的DataContext
一個類。 ActivityViewModel
有Activity
類型Activity
財產,其中ActivityStatuses
類型ObservableCollection<ActivityStatus>
類型的財產。在我有一個ComboBox
聲明如下:
<ComboBox ItemsSource="{Binding ActivityStatuses}"
SelectedItem="{Binding Activity.Status, Mode=TwoWay}"
DisplayMemberPath="Name" />
這讓我選擇從ComboBox
的ActivityStatus
,這在視圖模型的Activity
屬性正確更新Activity
的Status
財產。問題在於雙向綁定...當加載新的Activity
時,ComboBox.SelectedItem
不會更新以顯示Activity.Status
屬性值。
使用ComboBox
的該聲明,SelectedItem
勢必在Activity
的ActivityStatus
對象,這是一個不同的目的是在一個與所述視圖模型ActivityStatuses
屬性相同的值。因此,WPF框架不認爲這些項目是相同的,並且不會選擇ComboBox
中的項目。
如果我每次加載後Activity
從分配與到Activity.Status
屬性相同的值集合中的項目,則ComboBox
找到匹配它ItemsSource
收集並正確設置SelectedItem
屬性顯示的值。我不想這樣做,但因爲我在Activity
類中有許多其他類似的屬性,所以我將不得不在任何地方重複此代碼,以便雙向綁定到ComboBox
es。
所以我也試過如下結合ActivityStatus.Guid
屬性:
<ComboBox ItemsSource="{Binding ActivityStatuses}"
SelectedValue="{Binding Activity.Status.Guid, Mode=TwoWay}"
SelectedValuePath="Guid"
DisplayMemberPath="Name" />
加載不同Activity
對象時,這正確選擇的對象具有相同Guid
作爲一個從ComboBox.ItemsSource
集合Activity.Status
財產。此方法的問題是SelectedValue
綁定到ActivityStatus
對象中的ActivityStatus.Guid
屬性,因此當更改UI中的值時,只有ActivityStatus
對象的'Guid'屬性會更新,而名稱保持不變。除Guid
屬性的值外,Activity.Status
屬性中的對象不會更改。
正如你所看到的,我也嘗試過實施Equals
方法,因爲我認爲ComboBox
會使用它來比較對象,但它沒有任何區別。所以最後,我不知所措,急於找到一個簡單的方法來解決這個問題......希望有一個簡單的屬性,我錯過了ComboBox
。
我只是希望能夠選擇在ComboBox
一個項目,因此有Activity.Status
對象的變化和改變從代碼Activity.Status
屬性的值,並有ComboBox.SelectedItem
也相應更新。我會很感激任何建議。
UPDATE >>>
讀數的響應後,我盡了代碼樣本中的新的解決方案,並看到它的工作如預期。然後我仔細檢查了他的代碼,發現它和我的代碼一樣,所以再次運行我自己的解決方案(這是本文以來的第一次)。令我驚訝的是,它沒有改變任何代碼就按預期工作!
這讓我很困惑,我花了一些時間來了解發生了什麼事。事實證明,問題在於Visual Studio 2010!作爲最後階段,我已將Equals
方法添加到我的數據類型中。出於某種原因,Visual Studio在運行應用程序時沒有構建數據類型項目。
因此,應用程序必須使用一個較舊的dll文件,我的更改沒有被使用......我確實想知道爲什麼我的斷點在Equals
方法從未被擊中。這導致了我的假設,即實施Equals
方法無濟於事。 Visual Studio今天有同樣的行爲,這就是我發現發生了什麼。
我在我的解決方案中檢查了項目構建順序,但是在順序中的正確位置列出了數據類型項目。雖然在運行應用程序時,Visual Studio中的「輸出」窗口顯示了以不同順序加載的項目dll。我不確定爲什麼運行應用程序不再執行完整的構建,但至少我知道在運行應用程序之前必須先修改該項目。
最後更新>>>
我剛剛發現,爲什麼我的數據類型項目沒有建設......我看着在配置管理器窗口,只見那莫名其妙的平臺是不正確的這一項目,並生成複選框已經變得無法檢查!我不知道這是怎麼發生的,但是我終於明白了問題的根源讓我感到寬慰。
這裏有什麼是經典的「項目參考/文件參考」問題。您應該刪除對解決方案中其他項目的所有引用,並將它們重新添加爲**項目引用**。在構建或更改構建類型(如調試/發佈)時,文件引用不會自動更新。 *不要瀏覽到/ bin目錄以添加引用!*有關** Project References ** [請檢查此msdn文章]的更多信息(http://msdn.microsoft.com/zh-cn/library/ez524kew.aspx ) – Will 2011-05-30 17:42:54
謝謝@威爾,但我剛剛發現爲什麼我的數據類型項目不在構建中......我查看了Configuration Manager窗口,發現該平臺對於該項目來說不正確,並且Build複選框未被選中!我不知道這是怎麼發生的,但是我終於明白了問題的根源讓我感到寬慰。 – Sheridan 2011-06-04 00:04:02