2010-10-22 48 views

Trả lời

30

trong DataGrid của bạn, đăng ký cho sự kiện AutoGeneratingColumn, sự kiện args (DataGridAutoGeneratingColumnEventArgs) có tên cột và một "Cancel", nếu tên cột là ID sau đó thiết lập Cancel = true. nên làm các trick.

+0

Đó là công việc ...mặc dù nó ngay lập tức đi ngược lại mô hình MVVM ... nhưng chắc chắn sẽ không hoạt động. –

+4

Cảm ơn bạn, điều đó sẽ hoạt động tốt. Tôi không quá quan tâm với MVVM trong trường hợp này kể từ khi DataGrid là một phần của một UserControl tùy chỉnh và tôi không có vấn đề bằng cách sử dụng code-behind nếu nó là cái gì đó chỉ ảnh hưởng đến View. – Rachel

+0

@Aaron, nếu bạn đang dựa vào Chế độ xem để tạo MV, thì tôi nghĩ bạn sẽ thấy nó không tuân theo MVVM :) –

1

Tôi không thể nói được 4, tuy nhiên không thể thực hiện được trong 3.5 SP1, ít nhất là không đăng ký sự kiện mà tôi muốn tránh bằng mọi giá.

gì bạn có thể làm thay vào đó là thay đổi mã thế hệ của bạn để AutoGenerateColumns=False sau đó chỉ cần đặt các cột mà bạn quan tâm trong XAML như dữ liệu cơ bản tất cả sẽ vẫn được đặt trong các cột thích hợp

  <dg:DataGridTextColumn Header="Display" Binding="{Binding DisplayName}"/> 
      <dg:DataGridTextColumn Header="Host" Binding="{Binding HostName}"/> 
      <dg:DataGridTextColumn Header="Database" Binding="{Binding Database}"/> 
      <dg:DataGridTextColumn Header="Username" Binding="{Binding Username}"/> 
      <dg:DataGridTextColumn Header="Password" Binding="{Binding Password}"/> 

này sẽ cho phép bạn chỉ hiển thị các cột bạn quan tâm liên quan đến mô hình cơ bản cũng như thay đổi Header để hiển thị như bạn thấy phù hợp, vì vậy bạn không bị ràng buộc với tên Property trên mô hình.

+0

Đó không phải là một lựa chọn cho tôi kể từ khi tôi không biết tên cột trước – Rachel

+0

Đây là không được tạo ra từ một mô hình? Dữ liệu trông như thế nào ...? –

+0

Mô hình chỉ chứa một thuộc tính DataTable có chứa dữ liệu để hiển thị trong DataGrid. – Rachel

0

tôi sẽ không nói đó là giải pháp tuyệt vời ... nhưng ... bạn có thể có thêm một trừu tượng lớp ví dụ giả sử bạn có một đối tượng như:

public class Foo 
{ 
    public string Id { get; set; } 

    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

Bạn không muốn cột cho Id, do đó, bạn tạo đối tượng mới

public class Foo2 
{ 
    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

sau đó ánh xạ/chuyển đổi Foo thành Foo2 và bạn đã hoàn tất.

Một cách khác có thể (không phải lúc nào có thể) là thay đổi sửa đổi quyền truy cập vào nội

public class Foo 
{ 
    internal string Id { get; set; } 

    public string Property2 { get; set; } 

    public string Property3 { set; get; } 
} 

cách này bạn sẽ không phải Id cột tạo ra một trong hai.

2

khả năng khác sẽ là Visibility.Collapsed:

private void dataGrid_AutoGeneratingColumn(object sender, 
     DataGridAutoGeneratingColumnEventArgs e) 
    { 
     //Set properties on the columns during auto-generation 
     switch (e.Column.Header.ToString()) 
     { 
      case "rownameYouWantToHide": 
       e.Column.Visibility = Visibility.Collapsed; 
       break; 
     } 
    } 
6

Bạn có thể sử dụng một hành vi (mã tái sử dụng) để thực hiện công việc ... Bằng cách này bạn có thể sử dụng thuộc tính đó sẽ tập trung khả năng hiển thị cột ở một nơi.

Cách sử dụng:

<Window 
... 
xmlns:extension="clr-namespace:WpfControlLibrary.Extension;assembly=WpfControlLibrary"> 

<DataGrid ... 
    extension:DataGridBehavior.UseBrowsableAttributeOnColumn="True"> 

...

public class YourObjectItem 
{ 
    [Browsable(false)] 
     public Assembly Assembly { get; set; } 

Code:

using System; 
using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 

namespace WpfControlLibrary.Extension 
{ 
    public static class DataGridBehavior 
    { 
     public static readonly DependencyProperty UseBrowsableAttributeOnColumnProperty = 
      DependencyProperty.RegisterAttached("UseBrowsableAttributeOnColumn", 
      typeof(bool), 
      typeof(DataGridBehavior), 
      new UIPropertyMetadata(false, UseBrowsableAttributeOnColumnChanged)); 

     public static bool GetUseBrowsableAttributeOnColumn(DependencyObject obj) 
     { 
      return (bool)obj.GetValue(UseBrowsableAttributeOnColumnProperty); 
     } 

     public static void SetUseBrowsableAttributeOnColumn(DependencyObject obj, bool val) 
     { 
      obj.SetValue(UseBrowsableAttributeOnColumnProperty, val); 
     } 

     private static void UseBrowsableAttributeOnColumnChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e) 
     { 
      var dataGrid = obj as DataGrid; 
      if (dataGrid != null) 
      { 
       if ((bool) e.NewValue) 
       { 
        dataGrid.AutoGeneratingColumn += DataGridOnAutoGeneratingColumn; 
       } 
       else 
       { 
        dataGrid.AutoGeneratingColumn -= DataGridOnAutoGeneratingColumn; 
       } 
      } 
     } 

     private static void DataGridOnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
     { 
      var propDesc = e.PropertyDescriptor as PropertyDescriptor; 

      if (propDesc != null) 
      { 
       foreach(Attribute att in propDesc.Attributes) 
       { 
        var browsableAttribute = att as BrowsableAttribute; 
        if (browsableAttribute != null) 
        { 
         if (! browsableAttribute.Browsable) 
         { 
          e.Cancel = true; 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

Đây chính xác là những gì tôi đang tìm kiếm! Đã kiểm tra và làm việc trên .NET 4.6.1 :) – JoanComasFdz

+0

Cảm ơn! Nó là tốt đẹp để biết rằng nó vẫn hoạt động tốt :)! –

+0

DataGrid sẽ làm việc theo cách này ra khỏi hộp IMHO và nhận tiêu đề từ DisplayNameAttriibute quá! – StuartQ

Các vấn đề liên quan