【问题标题】:C# mvvm binding events onto RichTextBox [duplicate]C# mvvm 绑定事件到 RichTextBox [重复]
【发布时间】:2017-12-24 16:02:58
【问题描述】:

我找到了多种解决方案,如何将 RichTextBox 与 dragAndDrop 事件一起使用,但前提是我将方法放入 View .cs 文件中。我很好奇这是否可以通过 MVVM、绑定并将代码放入 ViewModel 中。

所以我有一个简单的 RichTextBox,我试图从视图模型绑定事件

<RichTextBox HorizontalAlignment="Left" Height="280" VerticalAlignment="Top" Margin="10,10,10,10"
                 PreviewDragEnter="{Binding RTBPreviewDragEnter}"
                 PreviewDragOver="{Binding RTBPreviewDragEnter}"
                 PreviewDrop="{Binding RTBPreviewDrop}"
                 >

        <FlowDocument>
            <Paragraph>
                <Run Text="RichTextBox"/>
            </Paragraph>
        </FlowDocument>
    </RichTextBox>

和视图模型

 private Boolean IsFileImage(string fileName)
    {
        return true;
    }

    public void RTBPreviewDrop(object sender, DragEventArgs e)
    {

        if (e.Data.GetDataPresent(DataFormats.FileDrop))
        {
            string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);
            if (files != null && files.Length > 0)
            {
                Console.WriteLine("preview drop");
                e.Handled = true;
            }
        }

    }

    public void RTBPreviewDragEnter(object sender, DragEventArgs e)
    {
        string[] files = (string[])e.Data.GetData(DataFormats.FileDrop);

        if (files != null && files.Length > 0 && files.Where(IsFileImage).Any())
        {
            Console.WriteLine("preview drag enter");
            e.Handled = true;
        }
    }

当我尝试运行它时,它会抛出异常 无法在 RichTextBox 类型的属性 AddPreviewDragEnterHandler 上设置绑定,我应该在 DependencyObject 上使用 DependencyProperty

是否可以通过 MVVM 绑定 RichTextBox 上的事件而无需依赖? (我在某处读到依赖不是 MVVM 的好主意)

我还在这里找到了this 问题,这是相同的,但它使用的是 Expression Blend SDK。使用它有好处吗?

或者说哪种方法在 MVVM 中比较好?

编辑: 这个问题被标记为重复,但在其他问题中作者接受了通过 Expression Blend SDK 实现的解决方案,但我只是好奇它是否可以在没有它的情况下完成。

【问题讨论】:

    标签: c# wpf mvvm richtextbox


    【解决方案1】:

    https://www.codeproject.com/Articles/874425/Drag-and-Drop-in-MVVM-WPF

    我发现上面附加的行为非常好。我不得不对其进行一些研究以弄清楚它是如何工作的,但这是非常值得的(您可以下载一个示例项目)。我发现它非常动态和干净,非常适合 MVVM 方法。

    它的可扩展性也很强;有很多增强、修改、定制等的空间。例如,我当前的版本有一个附加属性CanDropLogic

    delegate bool CanDropLogic(UIElement DropTarget, Point CurrentPosition, Window TopWindow);
    

    如果我的DropTarget 类似于ListBox,这允许我动态地为行为提供进一步的逻辑,并且我只想能够拖放到符合特定条件的项目上。

    【讨论】:

      猜你喜欢
      • 2011-09-23
      • 2014-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-14
      • 2011-10-30
      • 1970-01-01
      • 2012-06-17
      相关资源
      最近更新 更多