2010-04-29 71 views
1

很抱歉,較早的冗長帖子。這裏是我簡潔的(!)描述。組合框與集合視圖itemssource不更新對模型的更改的選擇框項目

我將集合視圖綁定爲組合框作爲itemsSource,並將其selectedvalue與我的視圖模型中的屬性綁定。我必須保持IsSynchronizedWithCurrentItem =「False」。

我更改視圖的源列表,然後刷新視圖。已更改(添加,刪除,已編輯)的項目正確顯示在組合的項目列表中。但問題在於選定的項目。當我改變其屬性也是組合的顯示成員路徑時,改變的屬性值不會反射回組合的選擇框。如果您打開組合下拉列表,它將正確顯示在項目列表中,但不會顯示在選擇框中。

現在,如果我將我的XAML中的組合框標籤更改爲Listbox(保留所有屬性),那麼當所選項目的displaymember屬性值更新時,這些更改會反射回列表框的選定項目。

爲什麼會出現這個問題?

僅供參考:

  1. 我的視圖模型具有性能EmployeeCollectionView和SelectedEmployeeId這必將爲組合的的ItemsSource和的SelectedValue RESP。該VM實現INotifyPropertyChanged接口。

  2. 我的核心員工類(EmployeeCollectionView的源代碼清單)只是一個沒有INotifyPropertyChanged的Model類。

  3. DisplayMemberPath是員工Model類的「Name」屬性。我通過某種方式改變了這一點,並期望組合選擇框更新值。

  4. 我嘗試通過將SelectedEmployeeId設置爲0(其中它正確地從itemsSource中選擇虛擬「 - 全選 - 」員工條目)和舊選定值後刷新其SelectedEmployeeId。但沒用。舊的價值將我帶回舊的標籤​​。項目集合雖然有最新的條目。

  5. 當我在視圖的刷新和刷新之前使組合框的IsEditable = True時,我使IsEditable = False,然後事情正常工作!

但是這是一個補丁,是不必要的。

THX

攝影指導Vinit Sankhe

回答

0

你點#2,#3,爲什麼這是行不通的。當ComboBox選擇一個項目時,它將在框中顯示Employee.Name屬性。您在#2中聲明Employee沒有實現INotifyPropertyChanged,在#3中您正在更改Name並期望它在ComboBox中更新。但ComboBox不知道屬性發生了變化,所以它的顯示值不會改變。

我已經把一個非常簡單的例子展示出來。如果您註釋掉PropertyChanged事件,您會注意到單擊該按鈕不再對UI有影響。

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     SizeToContent="WidthAndHeight"> 
    <StackPanel> 
     <ComboBox ItemsSource="{Binding}" DisplayMemberPath="Name" SelectedIndex="0" Width="150" Height="25" /> 
     <Button Content="Change" Width="75" Height="25" Click="button_Click"/> 
    </StackPanel> 
</Window> 

而後面的代碼...

public partial class MainWindow : Window 
{ 

    private ObservableCollection<Thing> things; 
    private Queue<string> words; 

    public MainWindow() 
    { 

     // some dummy data 
     string text = "Lorem ipsum dolor sit amet consetetur sadipscing elitr sed diam nonumy eirmod tempor invidunt ut labore et dolore magna aliquyam erat sed diam voluptua"; 
     words = new Queue<string>(text.Split(' ')); 

     things = new ObservableCollection<Thing>(); 
     things.Add(new Thing { Name = words.Dequeue() }); 
     things.Add(new Thing { Name = words.Dequeue() }); 
     things.Add(new Thing { Name = words.Dequeue() }); 

     DataContext = things; 

     InitializeComponent(); 

    } 

    private void button_Click(object sender, System.Windows.RoutedEventArgs e) 
    { 
     things[0].Name = words.Dequeue(); 
    } 

} 
+0

喬希嗨, THX對療法的答案,但那麼爲什麼這項工作的列表框。列表框的選定項目正確顯示更新的名稱(不帶INotify接口)。 據我所知,在MVVM中,核心模型類(我的例子中的員工類)不建議有INotifyPropertyChanged。只有ViewModel實現這個接口。 – 2010-04-30 10:44:35

+0

沒有看到代碼,我很難分辨ListBox的工作原理。但是你對MVVM的理解並不一定是錯誤的,但是MVVM還是比較新的,並沒有真正的硬性規定。事實是,在MVVM中,您不應該直接在用戶界面中公開「模型」類,但每個人都會不時地違反該規則。但是,如果您想要更改綁定成員以反映在用戶界面中,則必須*實施INotifyPropertyChanged。 – Josh 2010-04-30 13:10:10

相關問題