我見過這個問題,問了很多次,並且遍歷了我的代碼。但是,當我使用對象分配到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
絕對是列表框中的一個對象。沒有運氣。
這不是一個可見性的東西,如果該項目在屏幕上,它仍然不會突出顯示。我是否需要實現某種平等功能?我浪費了更多的時間,而不是人們可能會想到的。
謝謝。
我無法用我們看到的代碼重現這一點。我爲TubeViewModel製作了一個虛擬類,並使用了所有發佈的代碼,並按預期工作。某些事情必須在其他地方發生。 – 2009-12-15 18:32:00
非常感謝Ben和Kent。我休假了一段時間,這將不得不等待。 – Thomas 2009-12-15 20:22:59