【问题标题】:WPF MVVM: Access a listview object from View ModelWPF MVVM:从视图模型访问列表视图对象
【发布时间】:2017-07-03 21:01:28
【问题描述】:

我有一个列表视图。我已经实现了 MVVM 模式。

现在,在视图中,我为列表视图定义了 ItemContainerStyle,如下所示:

<ListView.ItemContainerStyle>
    <Style TargetType="ListViewItem">
             <Setter Property="IsSelected" Value="{Binding IsSelected}"/>
             <EventSetter Event="PreviewMouseLeftButtonDown" Handler="lstItemContact_MouseDown" />
             <EventSetter Event="PreviewMouseMove"  Handler="lstItemContact_MouseMove" />
    </Style>
</ListView.ItemContainerStyle>

在代码后面 (xaml.cs) 我有以下事件,例如 PreviewMouseLeftButtonDown:

    private void lstItemContact_MouseMove(object sender, MouseEventArgs e)
    {
        if (e.LeftButton == MouseButtonState.Pressed)
        {

            // Get the current mouse position
            Point mousePos = e.GetPosition(null);
            Vector diff = _startPoint - mousePos;

            if (
    Math.Abs(diff.X) > SystemParameters.MinimumHorizontalDragDistance ||
    Math.Abs(diff.Y) > SystemParameters.MinimumVerticalDragDistance)
            {
                if (e.Source != null)
                {
                    List<DataModel> myList = new List<DataModel>();
                    foreach (DataModel Item in lvUsers.SelectedItems)
                    {
                        myList.Add(Item);
                    }

                    DataObject dataObject = new DataObject(myList);
                    DragDrop.DoDragDrop(lvUsers, dataObject, DragDropEffects.Move);
                }
            }
        }
    }

lstItemContact_MouseMove 事件是我实现的拖放功能的一部分。

lvUsers 是我在视图中的列表视图,而我的数据模型是你假设的 DataModel。

它工作正常,但现在我想将“lstItemContact_MouseMove”事件从视图移动到我的视图模型并使用 ICommand(也许可以将 listview 对象作为参数传递给 ICommand,我不知道) .我的问题是我不知道如何从 View Model 访问我的列表视图(lvUsers),以便将列表视图作为参数传递给函数:

DragDrop.DoDragDrop(lvUsers, dataObject, DragDropEffects.Move);

在“lstItemContact_MouseMove”事件中。

那么我该怎么做呢?

【问题讨论】:

  • 为什么首先要在视图模型中实现拖放操作?
  • @mm8 我是 MVVM wpf 的新手。因为我不知道在视图和数据模型之间建立依赖关系是否正确。这是一个好习惯吗?是否尊重 MVVM 原则?

标签: c# wpf listview mvvm


【解决方案1】:

我认为就您而言,最好的做法是:

  1. 将其留在代码隐藏中,不用担心。
  2. 从中做出行为。

您的 ViewModel 不应该关心诸如拖放之类的 UI 问题,但是单独的 Behavior 是放置它的好地方。

您也可以在MSDNCodeProject 阅读有关它的信息

【讨论】:

  • 我非常喜欢你的行为解决方案。我会努力做到的。有什么问题我会告诉你的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-24
  • 2019-10-03
  • 1970-01-01
  • 2011-02-20
  • 1970-01-01
  • 2014-10-24
相关资源
最近更新 更多