【问题标题】:Silverlight Listbox: Binding does not get updatedSilverlight 列表框:绑定未更新
【发布时间】:2011-07-07 11:13:54
【问题描述】:

我有一个包含多个步骤的向导控件。不可见的控件将从可视树中删除。我在一页上有一个ListBox,它绑定到一个ObservableCollection<T>。当项目被添加或删除到一个页面上的ListBox,另一个页面上的ListBox(具有相同的ItemsSource)时,另一个页面上的绑定不会更新。我希望这足以清楚地解释我的问题。

当页面再次添加到可视化树时,如何更新此绑定?

【问题讨论】:

  • 您如何在该列表框中添加或删除项目?
  • 每一页代表一个步骤?
  • 每一页代表一个步骤,是的。我不是直接添加和删除列表框,而是添加到 ObservableCollection
  • 让我直截了当地说:您有两个(或更多)列表框同时不可见,展位使用相同的 ObservableCollection 馈送。当其中任何一个不可见时,您可以将其从可视化树中完全删除 ¿ 但是您在某处保留引用对吗?当其中一个需要可见时,您将其重新添加到可视化树中,并且您会看到以前的更改未填充。 ¿ 我说的对吗?
  • 是的@NestorArturo,当项目被删除然后添加时,它们会被添加两次。清除列表有效,但再次添加项目将添加两次或三次,具体取决于它重复的次数。

标签: data-binding silverlight-4.0 observablecollection


【解决方案1】:

我无法重现您的问题。我能够从可视化树中删除 ListBox,将对象添加到 ObservableCollection,当我将其添加到可视化树时,项目实际上会更新。

尝试通过将可见性设置为 Collapsed 而不是从 Visual Tree 中删除来解决您的问题。

public partial class MainPage : UserControl
{
    public MainPage()
    {
        InitializeComponent();

        this.listBox1.ItemsSource = o;
        this.listBox2.ItemsSource = o;
    }

    ObservableCollection<int> o = new ObservableCollection<int>();
    private void buttonList1_Click(object sender, RoutedEventArgs e)
    {
        if (this.listBox1.Parent == null)
            this.LayoutRoot.Children.Add(this.listBox1);
        else
            this.LayoutRoot.Children.Remove(this.listBox1);

        //this.listBox1.Visibility = this.listBox1.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
    }

    private void buttonList2_Click(object sender, RoutedEventArgs e)
    {
        if (this.listBox2.Parent == null)
            this.LayoutRoot.Children.Add(this.listBox2);
        else
            this.LayoutRoot.Children.Remove(this.listBox2);

        //this.listBox2.Visibility = this.listBox2.Visibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible;
    }

    private void ButtonAddMore_Click(object sender, RoutedEventArgs e)
    {
        o.Add(o.Count);
    }

}

【讨论】:

  • 尝试添加一个对象,然后删除该对象并在该项目不在可视树中时再次添加它,您会看到奇怪的行为。此外,使用 ContentControl.Content 设置应在 layoutroot 中的项目。
猜你喜欢
  • 2011-05-27
  • 1970-01-01
  • 1970-01-01
  • 2023-03-08
  • 2011-05-10
  • 2011-09-01
  • 2011-04-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多