2012-03-22 58 views
2

我有一個TreeView,允許用戶選擇不同的項目。使用DataType將DataType設置爲適當的ViewModel類型來確定每個項目的顯示。 DataContext會根據樹視圖中選定的項目自動設置到相應的ViewModel。更改數據模板的數據上下文清除組合框選擇

這裏的問題:

其中的DataTemplates的已綁定一個ObservableCollection獲得項目的列表和屬性來獲取/設置的SelectedValue在視圖模型組合框。

當我選擇這種類型的一個項目,然後選擇另一個相同類型的項目時,ComboBox將顯示空白而不是正確的選定項目。看起來,組合框在轉換到新項目後立即將SelectedValue屬性設置爲NULL,然後從不更新。

<ComboBox Margin="1,0" 
    ItemsSource="{Binding ItemsToSelect}" 
    SelectedValue="{Binding SelectedValue}" 
    SelectedValuePath="ValuePath" DisplayMemberPath="DisplayPath" 
    IsEnabled="{Binding CanSelectItem}"> 
</ComboBox> 

真是個奇怪的部分是,如果我選擇選擇同一類型的項目之間的不同類型的項目,它總是正確顯示。

我試着忽略了SelectedValue設置器中的NULL值,而且無論我是否也引發了PropertyChanged事件都不起作用。

private MyObject selectedValue; 
public MyObject SelectedValue 
{ 
    get 
    { 
     return selectedValue; 
    } 
    set 
    { 
     if (value != null) 
     { 
      this.selectedValue = value; 
     } 
     this.OnPropertyChanged("SelectedValue"); 
    } 
} 

縱觀類似的問題,而寫這使我,我還沒有發現一個有趣的屬性 - IsSynchronizedWithCurrentItem從這個question。起初,我認爲這解決了這個問題,但是它只是在一定程度上改變了行爲。

將此屬性設置爲True,組合框不完全清除其選擇,而只是將第一個項目標記爲選定項目。因此,現在將SelectedValue屬性設置爲列表中的第一項,而不是設置爲NULL

任何人有任何解決方案的想法?

回答

1

我身邊找到了一個工作,但它是不是很什麼我想要的。

我更改了綁定使用SelectedItem而不是SelectedValue,並且不會發生此問題。

我從這個question得到了主意。

因此,我改變

SelectedValue="{Binding SelectedValue}" 

(並改名爲我的視圖模型屬性):

SelectedItem="{Binding SelectedItem}" 

更新這個屬性在視圖模型的用途後,一切正常。

1

如果我正確理解你的問題,這裏有幾件事情正在進行。

首先你沒有在你的綁定中設置Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}

其次,屬性綁定只會在值本身發生變化時更新。

檢查了這一點Data Binding

+0

感謝您的回答。不幸的是,ComboBox.SelectedValue默認根據[MSDN](http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvalue.aspx)綁定「TwoWay」 – davisoa 2012-03-22 21:42:24