WPF:如何在视图模型事件响应中触发GUI行为?

6
我正在开发一个WPF/MVVM应用程序,我有一个ListBox将数据绑定到ViewModel。在不同的时间点,我需要ViewModel导致ListBox滚动到给定元素。
如何在不创建自定义控件的情况下完成此操作,同时仍保持良好的关注分离?我目前已经通过在视图层中创建一个自定义行为类,并在XAML代码中绑定到视图模型中的整数,使用依赖属性VisibleIndex来使其正常工作:
<ListBox x:Name="myListBox" 
        local:ListBoxVisibilityBehavior.VisibleIndex="{Binding VisibleIndex}">

当整数被设置时,它会触发依赖属性更新处理程序,告诉列表框滚动到关联的索引。

尽管如此,这似乎有点不可靠,因为列表框从未更改依赖属性值,而更新处理程序仅在值更改时才会被调用,因此确保相关项目可见的唯一方法是执行以下操作:

// view-model code
this.VisibleIndex = -1;
this.VisibleIndex = 10;

目前我使用行为类的唯一原因是绑定自定义依赖属性,有没有办法改用事件来实现这个功能呢?


我觉得@EdwardTanguay的问题为什么WPF / Visual Studio对MVVM中的事件和命令支持如此不足?何时放弃MVVM才有意义?已经自我解答了。 - Gennady Vanin Геннадий Ванин
你为什么认为这是一个hack?这就是Behaviors的用途。你打算什么时候更新ListBox的VisibleIndex值?你的Behavior在它的OnAttached()函数中可以监听来自ListBox所需的特定事件,并相应地更新VisibleIndex。在我看来,这是一个非常不错的实现,也比将其绑定到代码后台中的事件更具可重用性。将事件绑定到代码后台没有任何问题,因为它只与视图相关,但它不像Behavior那样可重用(需要复制粘贴以供将来使用)。 - Viv
2个回答

0

在编程中,附加属性在您的情况下是必需的 - 因为在某个时候,'某个地方'你需要调用以下方法...

ListBox.ScrollIntoView(item)  

或者

ListBoxItem.BringIntoView();

为此,您需要一些代码支持 - 附加属性/行为是一种很好的打包方式,而不会影响您的MVVM。

话虽如此 - 如果您只需要始终将所选项目滚动到视图中(这在大多数情况下都是如此)。那么您可以使用基于不同附加属性的解决方案(再次):

mvvm how to make a list view auto scroll to a new Item in a list view

然后,您只需设置或绑定到SelectedItem即可。

如果您愿意,这样会更加“美观”,但机制是相同的。


感谢您的回复,NSGaga。我可能没有完全清楚我的问题,但我已经在使用附加属性了。附加属性的问题在于,除非值发生更改,否则它们的处理程序不会被调用,并且据我所知,不存在“只写”附加属性这样的东西。我想要找出的是,WPF是否支持类似于附加属性的东西,但其中处理程序响应自定义事件而不是属性更改。 - Mark Feldman
1
不客气,马克 - 我认为你有些混淆了一些事情 - 当你设置VisibleIndex时,“dp”值会发生变化 - 这就是它的工作原理。如果你只做到这一点,你就有了一个“只写”的(它有一个“获取”,但它没有被使用,所以谁在乎呢?)。你有触发器和XAML中的数据触发器 - 但在你的情况下不起作用 - 这就是我试图说的。你需要要么a)代码后台或b)附加-p。如果你想要其他东西,你需要“画个图”,因为我不明白 :) - NSGaga-mostly-inactive
如果我将“VisibleIndex”设置为3,则DP更新处理程序将被调用,但如果在此之后再次这样做,则不会调用处理程序,因为处理程序仅在值更改时才会被调用。即使将其设置为-1,然后立即将其设置回3也不起作用,因为WPF将更改批处理到DP,并且“哦,值实际上并没有变化,所以让我们保持原样”。我正在尝试找出一种方法,使依赖属性更新处理程序无论值是否实际更改都会被调用。 - Mark Feldman

0

对于其他有兴趣了解答案的人,WPF论坛上的一位MS工程师为我澄清了这个问题。与其直接绑定到事件,你可以绑定到一个封装该事件的包装对象。然后,行为可以从其DP中获取对包装器的引用,并对其进行任何所需操作,例如订阅事件、触发事件等。


2
迟到总比不来得好:https://social.msdn.microsoft.com/Forums/vstudio/en-US/2e5bf19d-db96-4dfd-b240-55b89ef2248b/anything-like-attached-properties-but-with-events?forum=wpf - Mark Feldman

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接