代码之家  ›  专栏  ›  技术社区  ›  Thomas daign

列表框Twoway绑定到SelectedItem

  •  5
  • Thomas daign  · 技术社区  · 15 年前

    我已经看到这个问题问了很多次了,并且一次又一次地检查我的代码。但当我分配给我的 SelectedItem -与对象绑定的属性,它不会更新显示的选定项。似乎 ListBox 认为我分配的对象不是其项的成员。

    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>
    

    这是我尝试设置的地方之一的IMPL SelectedTube -绝对发生在主线程上。

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

    我注意到 选定的管 除非我手动单击它,否则不会突出显示,但有点忽略了它。但后来我想 ScrollIntoViewCentered 所选项目,因此我添加了 DependencyProperty 在我看来 选择项目 变化。处理程序最初看起来是这样的:

    private void OnSelectedItemChanged(DependencyObject target, DependencyPropertyChangedEventArgs e)
    {
        if (TubeList.SelectedItem == null)
           return;
    
        TubeList.ScrollIntoViewCentered(TubeList.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);
    }
    

    如果 选择项目 是外部设置的,容器为空。每一次。我甚至添加了代码来检查空值,然后在 ItemsSource 查找文件名匹配,然后更新 选择项目 确定 选择项目 绝对是列表框中的对象。运气不好。

    这不是可视性问题,如果项目在屏幕上,它仍然不会突出显示。我需要实现某种类型的相等函数吗?我在这件事上浪费的时间比人们想象的要多。

    谢谢。

    3 回复  |  直到 8 年前
        1
  •  5
  •   Community CDub    8 年前

    也许这也与 ItemContainerGenerators 在单独的线程中生成…( at least in the TreeView )

    在询问 集装箱发电机项目 财产。

        2
  •  3
  •   Tim Cooper    14 年前

    没有什么比明显的错误更让我吃惊了,但你已经掩盖了很多。我只能建议你简化一些事情,直到你找到问题,或者有一个完整的非工作的例子,你可以张贴。

        3
  •  1
  •   Kevin Mills    15 年前

    您是否尝试根据要设置的对象的哈希代码检查itemsource中每个对象的哈希代码?Linq查询将返回不同的内容。

    作为尝试将SelectedTube设置为项[0]的测试。