我在WPF中使用了devexpress,在这种情况下,我有一个DragDropManager,在代码后面有事件处理程序。当我将一行拖到网格控件上时,事件处理程序会按预期调用。我的问题是,包裹在事件参数中的控件的大多数定义属性都被问号"?"所取代,所以我真的无法从源代码管理(从中拖动行)中获得任何标识信息。上述情况的图像。
现在,我的观点片段如下。该代码段首先包含将行拖动到的控件,然后包含将行从中拖动的控件。为了简单起见,我删除了这些列。
<dxg:GridControl ItemsSource="{Binding DataViewSheets}" SelectedItem="{Binding SelectedDataViewSheet}" MaxHeight="300" Height="300" DefaultSorting="Name" x:Name="grc_sheets">
<dxg:GridControl.View>
<dxg:TableView Name="firstView" AllowBestFit="True" ShowColumnHeaders="True"
ShowVerticalLines="false" ShowHorizontalLines="True" ShowIndicator="False" IsDetailButtonVisibleBinding="{Binding Row.HasChildren, Mode=TwoWay}">
</dxg:TableView>
</dxg:GridControl.View>
<dxmvvm:Interaction.Behaviors>
<dxg:GridDragDropManager AllowDrag="False" AllowDrop="True" AllowScrolling="True" Drop="GridDragDropManager_OnDrop"/>
</dxmvvm:Interaction.Behaviors>
<dxg:GridControl.DetailDescriptor>
<dxg:DataControlDetailDescriptor ItemsSourcePath="DataViewAttributes">
<dxg:DataControlDetailDescriptor.DataControl>
<dxg:GridControl SelectedItem="{Binding SelectedDataViewAttributeViewModel}" x:Name="grc_sheetAttributes">
<dxg:GridControl.View>
<dxg:TableView ShowGroupPanel="False" DetailHeaderContent="DataControlDetailDescriptor" AutoWidth="False" ShowVerticalLines="false" ShowHorizontalLines="True" ShowIndicator="False" IsDetailButtonVisibleBinding="{Binding Row.HasChildren, Mode=TwoWay}"></dxg:TableView>
</dxg:GridControl.View>
<dxg:GridControl.DetailDescriptor>
<dxg:DataControlDetailDescriptor ItemsSourcePath="ChildDataViewAttributes">
<dxg:DataControlDetailDescriptor.DataControl>
<dxg:GridControl x:Name="grc_childAttributes">
<dxmvvm:Interaction.Behaviors> </dxmvvm:Interaction.Behaviors> <dxg:GridControl.View>
<dxg:TableView ShowGroupPanel="False" DetailHeaderContent="DataControlDetailDescriptor" AutoWidth="False" ShowVerticalLines="false" ShowHorizontalLines="False" ShowIndicator="False" IsDetailButtonVisibleBinding="{Binding Row.HasChildren, Mode=TwoWay}"></dxg:TableView>
</dxg:GridControl.View>
</dxg:GridControl>
</dxg:DataControlDetailDescriptor.DataControl>
</dxg:DataControlDetailDescriptor>
</dxg:GridControl.DetailDescriptor>
</dxg:GridControl>
</dxg:DataControlDetailDescriptor.DataControl>
</dxg:DataControlDetailDescriptor>
</dxg:GridControl.DetailDescriptor>
</dxg:GridControl>
<dxg:GridControl ItemsSource="{Binding CurrentDomain.EntityClasses}" x:Name="grc_availableAttributes">
<dxg:GridControl.View>
<dxg:TreeListView DataRowTemplateSelector="{StaticResource selector}" TreeDerivationMode="HierarchicalDataTemplate" ShowVerticalLines="False" ShowHorizontalLines="False" ShowIndicator="False"/>
</dxg:GridControl.View>
<dxmvvm:Interaction.Behaviors>
<dxg:TreeListDragDropManager AllowDrag="True" AllowDrop="False"/>
</dxmvvm:Interaction.Behaviors>
</dxg:GridControl>
围绕着这些网格控件,我有一个LayoutControl,里面有很多LayoutGroup,只是为了保持一切正常。
我曾尝试将其提取到一个简单的示例项目中,并请求DevExpress支持提供帮助,但到目前为止我得到的解决方案并没有帮助。提取的样本确实有效,我可以看到网格控件及其所有属性。当我试着把完全相同的东西放回我原来的项目中时,它已经不起作用了。唯一的区别是我的视图模型,没有实现我在原始项目中的一些东西。
尽管事件是在代码后面直接处理的,但我的视图模型真的会对事件参数产生影响吗?
后续问题:你们中有人经历过同样的事情吗,财产"消失"了?如果是,您的解决方案是什么?
更新:
为了好玩,我今天试着获取e.SourceControl的各种属性,看看它们是否真的可以被解决(没有更好的词),或者它们最终会抛出异常或为null。以下是我所做的:
private void GridDragDropManager_OnDrop(object sender, GridDropEventArgs e)
{
var control = e.SourceControl;
var name = control.Name;
var draggedRowContent = (EntityAttribute)e.DraggedRows[0];
((DataViewViewModel)DataContext).Execute_DropEntityAttribute(e);
}
不出所料,e.SourceControl仍然显示"?"对于大多数属性,但当尝试获取不同的属性时,我实际上得到了预期的结果。即使将控件添加到监视列表中,也会暴露出更多的问题,而不仅仅是通过调试器查看它。结论Visual Studio调试器机器有一些毛病,应该解决。