13

TrackableCollection にバインドされた wpf データグリッドがあります。一部のまれな状況で、選択されたごく少数のユーザーに対してのみ、ユーザーが一番下の空白行を入力して新しいレコードを追加すると、アプリケーションがクラッシュします。問題を再現できず、スローされた例外のスタック トレースしかありません。誰もこのようなものを見たことがありますか?自動化ピア クラスに関する知識は限られていますが、アプリケーションでそれらのいずれも使用していないことを確認できます。

スタックトレースは次のとおりです。

System.ArgumentNullException: Value cannot be null.
Parameter name: item
   at System.Windows.Automation.Peers.DataGridAutomationPeer.CreateItemAutomationPeer(Object item)
   at System.Windows.Automation.Peers.ItemsControlAutomationPeer.FindOrCreateItemAutomationPeer(Object item)
   at System.Windows.Automation.Peers.DataGridAutomationPeer.RaiseAutomationSelectionEvents(SelectionChangedEventArgs e)
   at System.Windows.Controls.DataGrid.OnSelectionChanged(SelectionChangedEventArgs e)
   at System.Windows.Controls.Primitives.Selector.SelectionChanger.End()
   at System.Windows.Controls.DataGrid.MakeFullRowSelection(Object dataItem, Boolean allowsExtendSelect, Boolean allowsMinimalSelect)
   at System.Windows.Controls.DataGrid.HandleSelectionForCellInput(DataGridCell cell, Boolean startDragging, Boolean allowsExtendSelect, Boolean allowsMinimalSelect)
   at System.Windows.Controls.DataGridCell.OnAnyMouseLeftButtonDown(MouseButtonEventArgs e)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.ReRaiseEventAs(DependencyObject sender, RoutedEventArgs args, RoutedEvent newEvent)
   at System.Windows.RoutedEventArgs.InvokeHandler(Delegate handler, Object target)
   at System.Windows.EventRoute.InvokeHandlersImpl(Object source, RoutedEventArgs args, Boolean reRaised)
   at System.Windows.UIElement.RaiseEventImpl(DependencyObject sender, RoutedEventArgs args)
   at System.Windows.UIElement.RaiseTrustedEvent(RoutedEventArgs args)
   at System.Windows.Input.InputManager.ProcessStagingArea()
   at System.Windows.Input.InputProviderSite.ReportInput(InputReport inputReport)
   at System.Windows.Interop.HwndMouseInputProvider.ReportInput(IntPtr hwnd, InputMode mode, Int32 timestamp, RawMouseActions actions, Int32 x, Int32 y, Int32 wheel)
   at System.Windows.Interop.HwndMouseInputProvider.FilterMessage(IntPtr hwnd, WindowMessage msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at System.Windows.Interop.HwndSource.InputFilterMessage(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled)
   at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o)
   at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs)
   at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler)

XAML:

<DataGrid Name="OrdreSLinjeGrid" 
          AutoGenerateColumns="False"
          CanUserResizeRows="False"
          CanUserAddRows="{Binding KanLeggeTilOrdreLinjer}"
          HorizontalScrollBarVisibility="Disabled" 
          VerticalScrollBarVisibility="Visible" 
          ItemsSource="{Binding Order.OrderLines, Mode=TwoWay}" CanUserSortColumns="False"
          SelectedItem="{Binding ValgtOrdreLinje}" >
    <DataGrid.Columns>           
        <DataGridTextColumn
            Header="{t:Translate Antall}" 
            TextAlignment="Right" 
            Width="50" 
            HeaderStyle="{StaticResource HøyrejustertColumnHeader}" 
            Binding="{Binding Antall, UpdateSourceTrigger=LostFocus}" />

        <DataGridTextColumn 
            Header="{t:Translate Pris}" 
            Width="60" 
            HeaderStyle="{StaticResource HøyrejustertColumnHeader}" 
            Binding="{Binding Pris, UpdateSourceTrigger=LostFocus, ValidatesOnDataErrors=True}" 
             />
    </DataGrid.Columns>
</DataGrid>

ご意見やご提案をいただければ幸いです。

4

6 に答える 6

10

この問題は、DataGridAutomationPeer.RaiseAutomationSelectionEvents単に SelectedItem プロパティが null かどうかをチェックしない内部メソッドのバグに関連しています。Windows 7 で「Microsoft Narrator」ツールを実行すると、簡単に再現できます。

これは封印されたクラスであるため、Reflection.Emit またはそこにあるモック ツールを使用してこのメ​​ソッドをインターセプトする以外に修正する簡単な方法はありません。修正されたとしても、Microsoft がこのメソッドの名前、シグネチャ、または動作を変更しないという保証はありません。 .

SelectedItem が null の場合に DataGrid が選択解除される方法を変更する DataGrid から継承することにより、「十分な」修正を実装しましたが、ナレーター/タッチスクリーンが存在する場合のみです。

バグがすぐに修正されることを願っています。必要に応じて UIAutomationProvider への参照を追加します。

using System.Windows.Automation.Peers;
using System.Windows.Controls;

public class TooDataGrid: DataGrid
{
    protected override void OnSelectionChanged(SelectionChangedEventArgs e)
    {
        if(AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementSelected) ||
            AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementAddedToSelection) ||
            AutomationPeer.ListenerExists(AutomationEvents.SelectionItemPatternOnElementRemovedFromSelection))
        {
            if(SelectedItem == null)
            {
                return;
            }
        }
        base.OnSelectionChanged(e);
    }
}
于 2015-05-14T15:27:10.943 に答える
9

私はこれがかなり古いことを知っていますが、私が遭遇したこの問題には良い解決策があります. IValueConverterインターフェイスを使用してカスタム コンバーターを定義できます。

public class SelectedItemConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value ?? DependencyProperty.UnsetValue;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value == null || value.GetType().Name == "NamedObject") ? null : value;
    }
}

これは、値が であるかどうかをチェックし、そうであるnull場合は を返しますDependecyProperty.UnsetValueドキュメントで説明されているように(メソッドの説明を見てください):

DependencyProperty.UnsetValue の戻り値は、コンバーターが値を生成せず、バインディングが FallbackValue (使用可能な場合) または既定値を代わりに使用することを示します。

null問題を解決するのではなく、これを返す必要があります。

于 2017-08-22T13:26:57.317 に答える
1

ビューモデルのプロパティでnullをチェックしようと思います。プロパティが null の場合は、null を 0 や空白などの有効な値に置き換えます。

値コンバーターを使用してこれを行うこともできます

于 2013-01-16T15:02:46.997 に答える
0

同じ問題があります。ユーザーが DataGrid の最初の行 (1 行のみ) をダブルクリックすると、Datagrid で発生します。これは、タッチスクリーンを搭載した Sony ラップトップでのみ発生します。Sony ソフトウェアは、Windows Explorer のすべてのファイルにチェックボックスを追加します。この問題は、ソニーのソフトウェアに関連していると思います。

于 2014-01-20T11:41:21.570 に答える