【问题标题】:Windows Phone 8 ListBox MVVM scrolling issueWindows Phone 8 ListBox MVVM 滚动问题
【发布时间】:2014-03-24 22:38:13
【问题描述】:

我正在编写一个 Windows Phone 应用程序,当我在其中一个页面中显示 ListBox 哪些项目时。

我的目标是在添加新项目时自动向下滚动ListBox,但我无法实现。

我已经阅读了许多有关行为和触发器绑定的示例,但我做不到。

我找不到适合我的有效Event,在那里我可以简单地获取ListBoxScrollViewer 并按照我的方法进行(这不是真的需要那样):

var childscount = VisualTreeHelper.GetChildrenCount(MyListBox);
for (int i = 0; i < childscount; i++)
{
    if (VisualTreeHelper.GetChild(MyListBox, i) is ScrollViewer)
    {
        var sv = VisualTreeHelper.GetChild(ic, i) as ScrollViewer;
        sv.ScrollToVerticalOffset(sv.ScrollableHeight);
        break;
    }
}

如果我必须在代码隐藏中编写它,那将没有问题,因为我可以在将新项目添加到集合时引发该方法。

问题是我正在尝试在 MVVM 中执行此操作。

【问题讨论】:

  • 我根本看不出这个想法的用处,你为什么要把这段代码移到你的视图模型中。最好的方法是通过继承 ListBox 控件并在添加新项后重新定义行为来制作新的 UI 组件。如果你真的想在视图模型中这样做,你必须让你的页面对你的 UI 可见,这打破了 MVVM 设计模式。

标签: c# xaml mvvm windows-phone-8 windows-phone


【解决方案1】:

你需要使用 => listbox.ScrollIntoView(listbox.Items[listbox.Items.Count - 1]);但是现在您需要将 selectedItem 设置为最后一个,并使用 SelectionChanged 在添加项目时始终使用此方法。

SelectedItem = yourList[yourList.lenght - 1]
SelectionChanged Event => listbox.ScrollIntoView(listbox.Items[listbox.Items.Count - 1]);
listBox.clearSelection

我认为它仍然有效。

【讨论】:

    【解决方案2】:

    如果有人要搜索,我将发布我的解决方案:

    public class ItemsControlBehavior : Behavior<ListBox>
    {
        protected override void OnAttached()
        {
            base.OnAttached();
            AssociatedObject.ItemContainerGenerator.ItemsChanged += ItemContainerGenerator_ItemsChanged;
        }
    
        protected override void OnDetaching()
        {
            base.OnDetaching();
            AssociatedObject.ItemContainerGenerator.ItemsChanged -= ItemContainerGenerator_ItemsChanged;
        }
    
        private void ItemContainerGenerator_ItemsChanged(object sender,
            System.Windows.Controls.Primitives.ItemsChangedEventArgs e)
        {
            if (AssociatedObject.Items.Any())
            {
                AssociatedObject.ScrollIntoView(AssociatedObject.Items[AssociatedObject.Items.Count - 1]);
            }
        }
    }
    

    【讨论】:

    • 当我再次使用 ListBox 打开页面时仍然遇到问题,当我打开页面时,ItemsChanged 事件被多次引发...我正在使用 App.RootFrame 方法在页面之间导航.Navigate()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多