Datagrid SelectedItem在window.IsEnabled = false上丢失

时间:2010-09-22 09:12:48

标签: wpf entity-framework mvvm wpfdatagrid

我有一个(主要)Window包含FramePage加载到Frame,其中一些viewmodel作为其datacontext。

View有一些datagrids,其中一个绑定到viewmodel而另一个绑定到selected.item(这样你就可以得到一个master-details视图..)

当我显示弹出框并设置主窗口IsEnabled = false时会出现问题。当发生这种情况时,绑定到viewmodel的数据网格中的选定项目将被取消选择,当然其他数据网格选择的项目也会被取消选中。

当mainwindow.IsEnabled设置为false时,如何保留UI的“状态”?

3 个答案:

答案 0 :(得分:1)

如果你想加入一些疯狂的混合物。在安装VS 2011 Beta(用.NET 4.5取代.NET 4.0框架)后,我创建了一个小型测试应用程序,其中 VS 2010以4.0 为目标,并且其行为再次改变为未设置SelectedItem禁用网格时为null。我不知道这是否会使它成为4.5的最终版本......

答案 1 :(得分:0)

似乎datagrid的内置行为是在数据网格被禁用时取消选择所选项目 - 我自己就验证了这一点。

但试试这个:

创建一个简单的ListView,添加一些数据,选择一个项目,单击一个按钮来禁用ListView。如果取消选择所选项,则此行为是在WPF中设计的。我认为,你无能为力。除了不禁用您的控件...

如果未取消选中所选项目,则可以在Connect中打开错误。可能需要几个月的时间才能得到回复并且修复“可能”会在几年后出现...如果这样的等待不是一个选项,那么也会在WPF工具包中发布一个错误(wpf.codeplex.com)。该工具包可能会更快更新。

答案 2 :(得分:0)

这是预期的行为,并且在设计上,但它既出乎意料又烦人,很多人认为应该将其删除。解决方法是创建一个继承自DataGrid的新DataGrid类,该类更改了此事件的行为。

<强> XAML

<DataGrid x:Class="MyDataGrid"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d">
</DataGrid>

代码背后

public partial class MyDataGrid : DataGrid
{
  public MyDataGrid()
  {
    InitializeComponent();
  }

  static MyDataGrid()
  {
    IsEnabledProperty.OverrideMetadata(
      typeof(MyDataGrid), 
      new FrameworkPropertyMetadata(OnIsEnabledChanged));
  }

  private static void OnIsEnabledChanged(
    DependencyObject d, 
    DependencyPropertyChangedEventArgs e)
  {
    d.CoerceValue(CanUserAddRowsProperty);
    d.CoerceValue(CanUserDeleteRowsProperty);

    CommandManager.InvalidateRequerySuggested();
  }
}

请参阅http://wpf.codeplex.com/workitem/13022