2009-12-15 92 views
5

我見過這個問題,問了很多次,並且遍歷了我的代碼。但是,當我使用對象分配到SelectedItem -bound屬性時,它不會更新顯示的選定項目。看來,ListBox認爲我分配的對象不是它的項目的成員。ListBox TwoWay綁定到SelectedItem

public class MainViewModel : ViewModelBase 
{ 
    //... 
    public SortedObservableCollection<TubeViewModel> Items { get; private set; } 
    public TubeViewModel SelectedTube { //get, set, propertychanged, etc. } 
} 

<ListBox x:Name="TubeList" 
     Margin="10" 
     ItemsSource="{Binding Items}" 
     ItemTemplate="{StaticResource TubeTemplate}" 
     SelectedItem="{Binding SelectedTube, Mode=TwoWay}" 
     SelectionMode="Single" 
     VirtualizingStackPanel.IsVirtualizing="False"> 
</ListBox> 

下面是從那裏我嘗試設置SelectedTube的地方之一IMPL - 肯定會出現在主線程上。

var match = 
    from t in Items 
    where t.Model.DataFileName == filename 
    select t; 
if (match.Any()) 
    SelectedTube = match.First(); 

我注意到,在SelectedTube從未強調,除非我手動點擊就可以了,但那種忽略了它。但後來我想ScrollIntoViewCentered的選定項目,所以我在我看來加了一個DependencyProperty來觀察SelectedItem的變化。該處理器最初看起來像這樣:

private void OnSelectedItemChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) 
{ 
    if (TubeList.SelectedItem == null) 
     return; 

    TubeList.ScrollIntoViewCentered(TubeList.SelectedItem); 
} 

但是,如果我通過我的綁定設置SelectedItem沒有工作。決定我想只有滾動它,如果它不是在屏幕上後,我改變了代碼如下:

private void OnSelectedItemChanged(DependencyObject target, DependencyPropertyChangedEventArgs e) 
{ 
    if (TubeList.SelectedItem == null) 
     return; 

    var container = TubeList.ItemContainerGenerator.ContainerFromItem(TubeList.SelectedItem) as FrameworkElement; 

    if(!container.IsVisible) 
     TubeList.ScrollIntoViewCentered(TubeList.SelectedItem); 
} 

如果SelectedItem外部設定,容器是空的。每次。我甚至添加了代碼來檢查null,然後遍歷ItemsSource查找文件名匹配,然後更新SelectedItem以確保SelectedItem絕對是列表框中的一個對象。沒有運氣。

這不是一個可見性的東西,如果該項目在屏幕上,它仍然不會突出顯示。我是否需要實現某種平等功能?我浪費了更多的時間,而不是人們可能會想到的。

謝謝。

+0

我無法用我們看到的代碼重現這一點。我爲TubeViewModel製作了一個虛擬類,並使用了所有發佈的代碼,並按預期工作。某些事情必須在其他地方發生。 – 2009-12-15 18:32:00

+0

非常感謝Ben和Kent。我休假了一段時間,這將不得不等待。 – Thomas 2009-12-15 20:22:59

回答

5

也許這也涉及到ItemContainerGenerators在一個單獨的線程中產生的事實......(at least in the TreeView

嘗試調用UpdateLayout請()你問ItemContainerGenerators屬性之前。

+0

我不明白爲什麼這是必要的,但我很高興。萬分感謝。 – Thomas 2010-01-06 17:24:08

3

沒有什麼比我明顯的錯,但你已經掩蓋了很多。我只能建議你簡化事情,直到你找到問題,或者有一個完整的非工作示例,你可以發佈。

1

您是否嘗試過檢查項目源中每個對象的哈希碼與您嘗試設置的對象的哈希碼? Linq查詢將返回不同的內容。

作爲嘗試將SelectedTube設置爲Items [0]的測試。

相關問題