首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ScrollIntoView for WPF DataGrid (MVVM)

ScrollIntoView for WPF DataGrid (MVVM)
EN

Stack Overflow用户
提问于 2013-08-02 14:27:59
回答 5查看 22.4K关注 0票数 23

我正在使用MVVM模式,并在XAML中为SelectedItem of DataGrid创建了一个绑定。我编程地设置了SelectedItem,但是当我这样做时,DataGrid不会滚动到所选内容。有什么办法可以做到这一点,而不完全打破MVVM模式?

我找到了以下解决方案,但当我尝试实现Behavior类时遇到了一个错误,即使我已经安装了though:http://www.codeproject.com/Tips/125583/ScrollIntoView-for-a-DataGrid-when-using-MVVM

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-03 03:04:18

这应该能行。这个想法是,您有这个附加属性,您将附加到DataGrid。在附加它的xaml中,将它绑定到ViewModel上的一个属性。每当您想以编程方式将值赋值给SelectedItem时,还会为此属性设置一个值,附加属性将绑定到该属性。

我已经将附加属性类型设置为无论SelectedItem类型是什么类型,但老实说,只要您将它设置为与以前不同的类型,就不重要了。这个附加属性只是用来以MVVM友好的方式在视图控件(在本例中是DataGrid)上执行一些代码。

也就是说,下面是附加属性的代码:

代码语言:javascript
运行
复制
namespace MyAttachedProperties
{
    public class SelectingItemAttachedProperty
    {
        public static readonly DependencyProperty SelectingItemProperty = DependencyProperty.RegisterAttached(
            "SelectingItem",
            typeof(MySelectionType),
            typeof(SelectingItemAttachedProperty),
            new PropertyMetadata(default(MySelectionType), OnSelectingItemChanged));

        public static MySelectionType GetSelectingItem(DependencyObject target)
        {
            return (MySelectionType)target.GetValue(SelectingItemProperty);
        }

        public static void SetSelectingItem(DependencyObject target, MySelectionType value)
        {
            target.SetValue(SelectingItemProperty, value);
        }

        static void OnSelectingItemChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
        {
            var grid = sender as DataGrid;
            if (grid == null || grid.SelectedItem == null)
                return;

            // Works with .Net 4.5
            grid.Dispatcher.InvokeAsync(() => 
            {
                grid.UpdateLayout();
                grid.ScrollIntoView(grid.SelectedItem, null);
            });

            // Works with .Net 4.0
            grid.Dispatcher.BeginInvoke((Action)(() =>
            {
                grid.UpdateLayout();
                grid.ScrollIntoView(grid.SelectedItem, null);
            }));
        }
    }
}

以下是xaml片段:

代码语言:javascript
运行
复制
<Window ...
        xmlns:attachedProperties="clr-namespace:MyAttachedProperties">
    ...
        <DataGrid 
            attachedProperties:SelectingItemAttachedProperty.SelectingItem="{Binding MyViewModel.SelectingItem}">
            ...
        </DataGrid>
    </Grid>
票数 38
EN

Stack Overflow用户

发布于 2017-04-15 10:39:13

我是MVVM的新手。我理解MVVM的思想,并试图正确地实现一切。我遇到了类似的问题,最后我得到了1行XAML和1行后面的代码。其余的代码在VM中。我在XAML中做了以下工作

代码语言:javascript
运行
复制
<ListBox DockPanel.Dock="Top"
    Name="Selection1List" 
    ItemsSource="{Binding SelectedList1ItemsSource}" 
    SelectedItem="{Binding SelectedList1Item}"
    SelectedIndex="{Binding SelectedList1SelectedIndex}"
    SelectionChanged="Selection1List_SelectionChanged">

下面的代码是:

代码语言:javascript
运行
复制
private void Selection1List_SelectionChanged(object sender, SelectionChangedEventArgs e) {
    Selection1List.ScrollIntoView(Selection1List.SelectedItem);
}

这个很好用。

我知道有些人甚至不希望窗口后面的代码中有一行代码。但我认为这一行只是为了看风景。它与数据或数据的逻辑无关。因此,我认为这并不违反MVVM原则,而且更容易实现。

欢迎任何意见。

票数 22
EN

Stack Overflow用户

发布于 2019-03-13 17:13:01

@Edgar的解决方案很好,但在我的应用程序中,我也必须检查SelectionChangedEventArgs的SelectionChangedEventArgs。

代码语言:javascript
运行
复制
private void OperatorQualificationsTable_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    if ((OperatorQualificationsTable.SelectedItem != null) && (e.OriginalSource?.Equals(OperatorQualificationsTable) ?? false))
    {
        OperatorQualificationsTable.ScrollIntoView(OperatorQualificationsTable.SelectedItem);
    }
}

我的数据集包含以下ComboBoxColumn

代码语言:javascript
运行
复制
<dgx:EnhancedDataGridComboBoxColumn 
    DisplayMemberPath="DescriptionNL"
    Header="{x:Static nl:Strings.Label_Qualification}"
    ItemsSource="{Binding Path=QualificationKeysView, Source={StaticResource ViewModel}}"
    SelectedValueBinding="{Binding ActivityQualification.QualificationKey}"
    SelectedValuePath="QualificationKey"/>

每当我向上或向下滚动时,选择更改事件就会被调用到Combobox中,并且不再可能将选定的项从视图中移出。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18019425

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档