我找到了多个解决方案,如何将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实现的解决方案,但我只是好奇是否可以在没有它的情况下完成。
答案 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
,我可以动态地为行为提供更多逻辑,我只希望能够放入符合特定条件的项目。