我有一个带有列表框的XAML视图:
<control:ListBoxScroll ItemSource="{Binding Path=FooCollection}"
SelectedItem="{Binding SelectedFoo, Mode=TwoWay}"
ScrollSelectedItem="{Binding SelectedFoo}">
<!-- data templates, etc. -->
</control:ListBoxScroll>
选定的项与视图中的一个属性绑定。当用户在列表框中选择项目时,我的视图模型中的SelectedFoo属性将得到更新。当我在视图模型中设置SelectedFoo属性时,列表框中将选择正确的项目。问题是,如果在代码中设置的SelectedFoo当前不可见,我需要另外调用ListBox的ScrollIntoView方法。由于我的ListBox位于一个视图内,而我的逻辑位于视图模型内...我找不到方便的方法来实现它。因此,我扩展了ListBoxScroll:
class ListBoxScroll : ListBox
{
public static readonly DependencyProperty ScrollSelectedItemProperty = DependencyProperty.Register(
"ScrollSelectedItem",
typeof(object),
typeof(ListBoxScroll),
new FrameworkPropertyMetadata(
null,
FrameworkPropertyMetadataOptions.AffectsRender,
new PropertyChangedCallback(onScrollSelectedChanged)));
public object ScrollSelectedItem
{
get { return (object)GetValue(ScrollSelectedItemProperty); }
set { SetValue(ScrollSelectedItemProperty, value); }
}
private static void onScrollSelectedChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var listbox = d as ListBoxScroll;
listbox.ScrollIntoView(e.NewValue);
}
}
它基本上公开了一个新的依赖属性ScrollSelectedItem
,我将其绑定到视图模型中的SelectedFoo
属性。然后,我钩入依赖属性的属性更改回调并将新选择的项滚动到视图中。
还有其他人知道在由视图模型支持的XAML视图上调用用户控件函数的更简单的方法吗?这有点绕:
- 创建一个依赖属性
- 添加到属性更改回调的回调
- 在静态回调中处理函数调用
最好将逻辑直接放在ScrollSelectedItem { set {
方法中,但是依赖框架似乎会绕过并成功工作而不实际调用它。
SelectedIndex
会更容易。 - Anatolii GabuzaDataGrid
- 是的。不幸的是,我还没有尝试过ListBox
。 - Anatolii Gabuza