2009-11-18 142 views
3

嗨如何以編程方式將Button列添加到Datagrid。我想通過代碼隱藏文件中的代碼來完成此操作。WPF:將按鈕列添加到Datagrid

另外我想選擇性地啓用或禁用基於記錄的這個按鈕(如果狀態是打開的,那麼啓用它就會禁用此按鈕)。這裏Status是DataSource中的一列。

感謝, ABHI

+0

http://stackoverflow.com/questions/1754608/what-status-startup-and-dd-button-dynamically-in-datagrid-in-wpf – Peter 2009-11-18 10:54:32

+0

試試這個:http://stackoverflow.com/questions/1754608/what-是代碼隱藏的數據網格模板列和如何使用它/ 1755556#1755556 – viky 2009-11-18 13:20:11

回答

5

通過VIKY聯答案總結了源添加按鈕欄的想法。我已經放了一個簡短的例子,它也顯示了你的問題的第二部分,這是如何基於網格中的數據啓用/禁用按鈕。我在4.0中使用了DataGrid,但使用3.5的工具箱也應該很好。

首先,我從XAML中添加一個Name列。這不是必需的,但僅僅表明您可以將XAML和C#添加到網格中。請注意,我在這裏命名網格,以便我有辦法在C#部分類中引用它。

<Window x:Class="WpfApplication2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="Data Grid Populated in XAML and C#"> 
    <Grid> 
     <DataGrid x:Name="_gridControl" IsReadOnly="True" AutoGenerateColumns="False"> 
      <DataGrid.Columns> 
       <DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}"/> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

現在,我在代碼背後做了兩件事。除了添加按鈕列和數據元素(具有名稱和狀態)外,我還創建了一個Converter類,如果值爲「Open」則返回true,否則返回false。然後,當設置綁定(而不是值)時,我還添加了我的轉換器,以便當ItemsControl爲我的項目生成並綁定容器時,顯示的按鈕的IsEnabled狀態鏈接到我的項目的狀態字段。

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 

     var buttonTemplate = new FrameworkElementFactory(typeof(Button)); 
     buttonTemplate.SetBinding(Button.ContentProperty, new Binding("Name")); 
     buttonTemplate.SetBinding(Button.IsEnabledProperty, new Binding("Status") 
     { 
      Converter = new StatusToEnabledConverter() 
     }); 
     buttonTemplate.AddHandler(
      Button.ClickEvent, 
      new RoutedEventHandler((o, e) => MessageBox.Show("hi")) 
     ); 
     this._gridControl.Columns.Add(
      new DataGridTemplateColumn() 
      { 
       Header = "Close Button", 
       CellTemplate = new DataTemplate() { VisualTree = buttonTemplate } 
      } 
     ); 

     this._gridControl.ItemsSource = new object[] 
     { 
      new { Name = "First Item", Status = "Open" }, 
      new { Name = "Second Item", Status = "Open" }, 
      new { Name = "Third Item", Status = "Closed" }, 
      new { Name = "Fourth Item", Status = "Closed" }, 
      new { Name = "Fifth Item", Status = "Open" } 
     }; 
    } 
} 

public class StatusToEnabledConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     return "Open".Equals(value); 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, 
     CultureInfo culture) 
    { 
     throw new System.NotImplementedException(); 
    } 
} 

最後一個重要提示是我只在調用InitializeComponent後從C#修改DataGrid。對於具有XAML和C#部分的WPF內容控件,這很重要,因爲在開始修改XAML中定義的對象之前,需要完成通過XAML完成的對象構造。

希望這會有所幫助!

+0

很好的例子。但是它會不必要地使用var關鍵字。沒有理由對ButtonTemplate使用隱式類型。它可能只是: FrameworkElementFactory buttonTemplate = new FrameworkElementFactory(typeof(Button)); – xr280xr 2011-05-17 22:50:34

+5

額外20個字符給我買什麼? – timmyl 2011-06-07 18:41:38

+0

我想,因爲編譯器仍然把這個變量視爲強類型的,它只是一個寵物。對不起,我收回了。 – xr280xr 2011-06-08 22:19:44