4

私は例外を取得しています:

'{0}' は Visual または Visual3D ではありません。

似ていることがわかった唯一の質問: WPF: System.ArgumentException => {"'{0}' は Visual または Visual3D ではありません。"}

「きれいな」グリッドを構築しているだけです。ダブルクリックを処理する必要はありません。ユーザーが誤ってダブルクリックした場合の副作用です-この例外がスローされます。

XAML は次のようになります。

<DataGrid
  ItemsSource="{Binding Source={StaticResource TrucksSource}}"
  CanUserReorderColumns="False" 
  CanUserResizeColumns="True" 
  CanUserResizeRows="False" 
  AutoGenerateColumns="False" 
  BorderThickness="0" 
  CanUserAddRows="False" 
  RowBackground="{StaticResource GrayBackgroundGradientBrush}"
  RowHeight="20" Focusable="False" RowHeaderWidth="0">
  <DataGrid.Columns>
      <DataGridTemplateColumn Header="Select" Width="40" CanUserSort="True" SortMemberPath="IsSelected">
          <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                  <CheckBox
                      IsChecked="{Binding IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
                      HorizontalAlignment="Center"
                      VerticalAlignment="Center" />
              </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>
      <DataGridTemplateColumn Header="Team" Width="42" CanUserSort="True" SortMemberPath="TeamDispatcherCaptionShort">
          <DataGridTemplateColumn.CellTemplate>
              <DataTemplate>
                  <Border
                  Margin="-2,-1">
                      <TextBlock ToolTip="{Binding TeamDispatcherCaptionLong}" 
                      Foreground="#414141" FontFamily="Arial" FontSize="12"
                      Text="{Binding TeamDispatcherCaptionShort}" 
                      HorizontalAlignment="Center" VerticalAlignment="Center" />
                  </Border>
              </DataTemplate>
          </DataGridTemplateColumn.CellTemplate>
      </DataGridTemplateColumn>

ユーザーがダブルクリックするたびに例外が発生します。最初の列はチェックボックスです。シングルクリックすると正しく動作します。チェックボックスの周りの任意の領域をクリックすると、例外が発生します。

どうすれば修正できますか?コードビハインドはありません。MVVM プロジェクトです。

編集:

わかりました、私は先に進み、小さなプロジェクトでこれを再現しようとしました. 私はすでに問題を考え出しましたが、これに対するあなたの見解を知りたいです..そして、私はこの賞金を授与する必要があります:)

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary>
            <CollectionViewSource x:Key="WidgetsSource" Source="{Binding Widgets}" />
        </ResourceDictionary>
    </Window.Resources>
    <Grid>
        <DataGrid
            ItemsSource="{Binding Source={StaticResource WidgetsSource}}"
            CanUserReorderColumns="False" 
            CanUserResizeColumns="True" 
            CanUserResizeRows="False" 
            AutoGenerateColumns="False" 
            BorderThickness="0" 
            CanUserAddRows="False" 
            VerticalGridLinesBrush="#00000000" 
            HorizontalGridLinesBrush="Gray" 
            RowBackground="LightGray"
            RowHeight="20" Focusable="False" RowHeaderWidth="0" SelectionUnit="Cell">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="Prop1" Width="50" CanUserSort="True" SortMemberPath="Prop1">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Border>
                                <TextBlock>
                                    <Run Text="{Binding NestWidg.Prop1}" />
                                </TextBlock>
                            </Border>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
                <DataGridTemplateColumn Header="Prop2" Width="50" CanUserSort="True" SortMemberPath="Prop1">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Border>
                                <TextBlock Text="{Binding Prop1}" />
                            </Border>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>                
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>

仮想マシン:

namespace WpfApplication1
{
    using System.Collections.ObjectModel;

    public class MainWindowVM
    {
        public ObservableCollection<Widget> Widgets { get; set; }

        public MainWindowVM()
        {
            this.Widgets = new ObservableCollection<Widget>();

            this.Widgets.Clear();
            this.Widgets.Add(new Widget("a", "b") { NestWidg = new NestWidget { Prop1 = "Nest" } });
        }
    }

    public class Widget
    {
        public Widget(string p1, string p2)
        {
            Prop1 = p1;
            Prop2 = p2;
        }

        public string Prop1 { get; private set; }

        public string Prop2 { get; private set; }

        public NestWidget NestWidg { get; set; }
    }

    public class NestWidget
    {
        public string Prop1 { get; set; }
    }
}

コードビハインド:

namespace WpfApplication1
{
    using System.Windows;

    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            this.InitializeComponent();
            this.DataContext = new MainWindowVM();
        }
    }
}
4

4 に答える 4

4

はい。サンプルプロジェクトはエラーをスローします。これは、Runでバインドしているためです。あなたの最初の投稿では、あなたはそれを見逃していたので、私はそれを再現することができませんでした。

本当に古いバグのようで、多くのユーザーがそれを持っています。マイクロソフトを知っているので、すぐに修正されることはありません。(バグは私が推測し始めてからWPFの一部でした)。あなたの最善の策は賢くなることです。

Visualsであるオブジェクトのみをバインドします。<実行>はビジュアルではありません。

バインディングを使用せずに、DataContextに基づいて正しい実行を生成するカスタムTextBlockを作成する必要があります。TextBlockの一部となる新しい依存関係プロパティを宣言し、UIPropertyChangedメソッドにフックする必要があります。そこで、Runs()を生成します。

于 2012-09-13T16:17:53.010 に答える
0

DataBinding はバックグラウンド スレッドによって更新されますか? そうであれば、それがエラーの原因です。そのようなクラッシュが一度あり、ここで解決しました。

于 2012-09-13T07:42:29.997 に答える
0

バグを再現できません。あなたのコードをデータでいっぱいにコピーしましたが、どこでもダブルクリックできます。.NET4.0 を実行していますか?

プログラム全体を添付するか、バグを生成するサンプル コードを提供してください。(収録データ等)

これを生成する正確なバインディング/UI 要素に絞り込む必要があります。このエラーの原因は CheckBox にありますか? 2 番目の列を削除するとどうなりますか? CheckBox を Border 内にラップし、background=Transparent に設定するとどうなりますか。これを 2 列目にするとどうなるでしょうか。

おそらく、MouseLeftButtonDown イベントリスナーをどこかにアタッチし、e.ClickCount==2 を使用して、マウスクリックがダブルクリックの一部であることを示しているかどうかを確認できます。その後、e.Handled=true で処理できます。

于 2012-09-13T07:13:00.617 に答える