2014-03-24 94 views
1

我有綁定到視圖模型一個WPF應用程序的簡單列表框,所以XAML的樣子:WPF MVVM ListBox中的SelectedItem不突出

<ListBox ItemsSource="{Binding Drivers}" 
     SelectedItem="{Binding SelectedDriver, Mode=TwoWay}" /> 

在我看來模型中,SelectedDriver設置,所以我希望當視圖顯示時,與SelectedDriver相關的列表框中的驅動程序應該高亮顯示,但不是。

當在視圖模型中設置SelectedItem值時,我需要做些什麼才能使SelectedItem突出顯示?

解決:根據下面的答案,我意識到雖然我的SelectedDriver對象實際上正在設置,但它不屬於Drivers集合。一旦我糾正了這一點,它按預期工作。感謝大家的意見。我沒有足夠的積分來回答答案,但非常感謝。

編輯:視圖模型確實實現INotifyPropertyChanged。視圖中的許多其他項目根據其綁定正確顯示。

編輯:視圖模型構造函數執行一些內務操作,它所做的一件事是將各種視圖元素設置爲之前的狀態。其中一個元素是驅動程序列表框,因此在視圖模型代碼中,它將被設置爲一個實際項目,就像您所描述的那樣: SelectedDriver = Drivers.Where(d => d.Id == savedId) 我有在Debug中驗證,此代碼正在查找正確的驅動程序,並且SelectedDriver的值是正確的,但它僅在UI中未突出顯示。

+1

您的ViewModel是否實現了'INotifyPropertyChanged'? –

+0

您的頁面生命週期中的哪一點是您的SelectedDriver被設置? – vidalsasoon

回答

-1

如果你想設置從代碼的集合控制的選擇的項目,那麼它是習慣將其從集合綁定到控件的屬性ItemsSource數據設置爲實際項目。你可以很容易地使用LinQ像這樣的:

SelectedDriver = Drivers.Where(d => d.Id == someIdNumber).First(); 

或者,如果你只是想設置的集合作爲選擇項中的第一項,那麼你可以這樣做:

SelectedDriver = Drivers[0]; 

如果那仍然不起作用,你是否實施了像@RohitVats建議的INotifyPropertyChanged interface

0

所有我的viewmodels繼承自實現INotifyPropertyChanged的這個ViewModelBase。您實際上必須調用事件處理程序來通知UI數據已更改。

public abstract class ViewModelBase : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void RaisePropertyChanged(string propertyName) 
    { 
     PropertyChangedEventHandler handler = this.PropertyChanged; 
     if (handler != null) 
     { 
      var e = new PropertyChangedEventArgs(propertyName); 
      handler(this, e); 
     } 
    } 
} 

所以SelectedDriver應該是這樣的:

private Driver selectedDriver; 
public Driver SelectedDriver 
{ 
    get { return selectedDriver; } 
    set 
    { 
     selectedDriver = value; 
     RaisePropertyChanged("SelectedDriver"); 
    } 
} 

如果一切正確綁定,並SelectedDriver屬於從ViewModelBase繼承的類,這應該工作。如果沒有,您可以檢查輸出窗口是否有錯誤的綁定。

相關問題