2016-12-22 2 views
1

私のクラスであるKDataGridを使ってDataGridをオーバーライドしました(私たちの目的のためにいくつかの機能が必要でした)。空のItemsSourceに対してのみDataGridに空の読み取り専用行を表示するにはどうすればよいですか?

public class KDataGrid : System.Windows.Controls.DataGrid { *** } 

任意のレコードタイプ(ジェネリックタイプ)のコレクションで使用できます。簡単KDataGridと

例XAML:

<components:KDataGrid 
    CanUserAddRows="False" 
    IsReadOnly="True" 
    ItemsSource="{Binding Path=SomeCollection}"> 
    <DataGrid.Columns> 
     <DataGridTextColumn 
      Header="ID" 
      Binding="{Binding Id}" 
      Width="50"/> 
     <DataGridTextColumn 
      Header="Code" 
      Binding="{Binding Code}" 
      Width="130"/> 
    </DataGrid.Columns> 
</components:KDataGrid> 

ビューモデルが含ま:

public class SomeRecord: BaseRecord 
    { 
     public long ID { get; set; } 
     public string Code { get; set; } 
    } 

public List<SomeRecord> SomeCollection { get; } 

KDataGrid(データグリッド)が読み取り専用です。そのため、DataGridの下部にある空白の行が表示されません。
コレクションSomeCollectionが空の場合、DataGridにフォーカスを設定することはできません(たとえば、新しいレコードを追加する場合など)。

これを修正する最も簡単な方法は、空の行(フォーカス可能)を表示することです。
しかし、コレクションに空の行を表示する必要のない少なくとも1つの行が含まれている場合。

どうすればいいですか?

答えて

0

問題解決は簡単です。 Thiereは空のレコードを追加する必要はありません。 ScrollViewerをクリックしてフォーカスを取得するだけです:

public class KDataGrid : System.Windows.Controls.DataGrid 
{ 
    public KDataGrid() 
    { 
     Loaded += OnLoaded; 
    } 

    private void OnLoaded(object sender, RoutedEventArgs routedEventArgs) 
    { 
     var scroll = FindVisualChild<ScrollViewer>(); 
     if (scroll != null) 
     { 
      scroll.MouseDown += (o, args) => 
      { 
       if (IsKeyboardFocusWithin) 
        return; 

       Focus(); 
      }; 
     } 
    } 

    public static T FindVisualChild<T>(this DependencyObject root) where T : DependencyObject 
    { 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(root); i++) 
     { 
      DependencyObject child = VisualTreeHelper.GetChild(root, i); 
      if (child != null && child is T) 
       return (T)child; 
      else 
      { 
       T childOfChild = child.FindVisualChild<T>(); 
       if (childOfChild != null) 
        return childOfChild; 
      } 
     } 
     return null; 
    } 
} 
0

どうすればいいですか?

あなたはあなたのビューモデルにあなたの「SomeCollection」に「空」「SomeRecord」オブジェクトを追加することができDataGrid内の空の行を表示したい場合:

SomeCollection.Add(new SomeRecord()); 

他のオプションがにあるをあなたはおそらく番目の種類を変更したい両方のケースで

<DataGrid CanUserAddRows="False" IsReadOnly="True" AutoGenerateColumns="False"> 
    <DataGrid.Style> 
     <Style TargetType="DataGrid"> 
      <Setter Property="ItemsSource" Value="{Binding SomeCollection}" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding SomeCollection.Count}" Value="0"> 
        <Setter Property="ItemsSource"> 
         <Setter.Value> 
          <CompositeCollection> 
           <local:SomeRecord /> 
          </CompositeCollection> 
         </Setter.Value> 
        </Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </DataGrid.Style> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="ID" Binding="{Binding ID}" Width="50"/> 
     <DataGridTextColumn Header="Code" Binding="{Binding Code}" Width="130"/> 
    </DataGrid.Columns> 
</DataGrid> 

:SomeCollectionソースプロパティが空の場合のみ、空の項目が含まれているCompositeCollectionにデータグリッドのItemsSourceプロパティを設定し、スタイルを使用しますe IDプロパティは長いものから長いものへ? ID列を空白にして、長さのデフォルト値である0を表示する必要があります。

関連する問題