gpt4 book ai didi

c# - 将 UI 操作委托(delegate)给 ViewModel 执行

转载 作者:行者123 更新时间:2023-11-30 17:51:46 24 4
gpt4 key购买 nike

我有一个 ScrollViewer,它包含一个 ItemsSource。这些项目绑定(bind)到 ViewModel 并按升序排序。允许用户将项目添加到此列表,但是,由于排序顺序,列表需要滚动到底部。根据我的发现,ScrollViewer 没有“锁定到底部”功能,但有一个 ScrollToEnd 方法可以满足我的需求。

但问题是,项目是在 ViewModel 中添加的,而 ViewModel 显然无权访问 View 以调用 ScrollViewer 上的 ScrollToEnd 方法>。为了解决这个问题,我在 ViewModel 中声明了一个 Action 委托(delegate),如下所示:

public Action ScrollAction { get; set; }

并在创建 ViewModel 时在 View 中设置它:

viewModel.ScrollAction = () => scrollViewer.ScrollToEnd();

一旦将项目添加到列表中,委托(delegate)就会在 ViewModel 中执行。尽管这可行,但对我来说感觉有点老套,因为这种方式打破了 ViewModel 与 View 的隔离。有没有更好的方法来实现这一点?

最佳答案

我还会为您的滚动查看器投票支持 AttachedProperty。

我创建了以下附加属性以将滚动绑定(bind)到一个 bool 变量结束。

public static class ScrollViewerBehavior
{
public static readonly DependencyProperty ScrollToRightEndProperty =
DependencyProperty.RegisterAttached("ScrollToRightEnd", typeof (bool), typeof (ScrollViewerBehavior),
new PropertyMetadata(false, OnScrollToRightEndPropertyChanged));

public static bool GetScrollToRightEnd(DependencyObject obj)
{
return (bool) obj.GetValue(ScrollToRightEndProperty);
}

public static void SetScrollToRightEnd(DependencyObject obj, bool value)
{
obj.SetValue(ScrollToRightEndProperty, value);
}

private static void OnScrollToRightEndPropertyChanged(DependencyObject sender,
DependencyPropertyChangedEventArgs e)
{
var sv = sender as ScrollViewer;
if (sv == null) return;

if ((bool) e.NewValue)
{
sv.ScrollToRightEnd();
}
else
{
sv.ScrollToLeftEnd();
}
}
}

您可以在 XAML 中使用此附加属性...

<ScrollViewer ... local:ScrollViewerBehavior.ScrollToRightEnd="{Binding IsScrolledToEnd}" ... />

或者,如果您想保存问题中的操作委托(delegate),您可以在上面的 OnScrollToRightEndPropertyChanged 方法中执行以下操作。

.....
var viewModel = sv.DataContext as YourViewModel;
if (viewModel != null)
{
viewModel.ScrollAction = () => sv.ScrollToRightEnd();
}
.....

关于c# - 将 UI 操作委托(delegate)给 ViewModel 执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19104211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com