C#mvvm将事件绑定到RichTextBox上

时间:2017-12-24 16:02:59

标签: c# wpf mvvm richtextbox

我找到了多个解决方案,如何将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>

和ViewModel

 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中很好?

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

1 个答案:

答案 0 :(得分:0)

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,我可以动态地为行为提供更多逻辑,我只希望能够放入符合特定条件的项目。