【问题标题】:Determining when Listbox has finished loading bound elements确定 Listbox 何时完成加载绑定元素
【发布时间】:2011-10-07 01:43:45
【问题描述】:

我有一个绑定到对象集合的 ListBox,一切正常,除了我不知道如何调用一些我需要在选择列表中的项目时执行的代码。

需要明确的是,当用户选择不同的项目时,我已经连接了 Listbox_SelectionChanged 事件 - 而且效果很好。

当 ListBox 第一次显示时,我想在列表中的第一项上调用相同的代码,它默认为。 ListBox_BoundDataFinishLoading 之类的东西..

有什么想法吗?

【问题讨论】:

    标签: c# wpf data-binding listbox binding


    【解决方案1】:

    您可以挂钩到 ItemList-Changed 事件并在添加后选择第一个项目:

    public MyWindow()  
    {  
        InitializeComponent();  
    
        ((INotifyCollectionChanged)ListBox.Items).CollectionChanged +=  
            ListBox_CollectionChanged;  
    }  
    
    private void ListBox_CollectionChanged(object sender,   
        NotifyCollectionChangedEventArgs e)  
    {  
        if (e.Action == NotifyCollectionChangedAction.Add && ListBox.SelectedItem == null)
        {
            ListBox.SelectedItem = e.NewItems[0];
        }      
    }
    

    【讨论】:

    • 我得到的唯一 NotifyCollectionChangedEventArgs 操作是重置
    • 这也应该完成这项工作,因为重置意味着列表发生了巨大变化(请参阅msdn.microsoft.com/en-us/library/…),例如重新加载,所以只需选择重置后的第一项...
    【解决方案2】:

    不太确定您是否真的可以找到 WPF 数据绑定完成的安全通知。但也许您可以执行以下操作:

    您说您已经处理了来自控件的 SelectionChanged 通知,所以这是 UI -> DataModel 工作流程。如果在您的绑定对象中有 Selected 属性并将其绑定到控件(比如说突出显示该行),这意味着在 SelectionChanged 事件上您可以执行 Selected=true,这将执行 UI-> ViewModel-> UI(选择一个排)。但这也意味着在您的 ViewModel 对象集合的初始绑定时刻应该足以让您将第一个元素的 Selected 属性设置为 true。

    对我来说,很难说它是否真的适用于你的情况,因为我不知道你的应用程序的架构,但这可能是遵循的方法之一。

    希望这会有所帮助。

    问候。

    【讨论】:

      猜你喜欢
      • 2011-08-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多