2012-11-15 43 views
0

我有一個DataGrid,我正在創建並從代碼填充。當網格首次出現RadioButton列時,「包含」似乎工作得很好。問題是,我改變排序後,RadioButton 不再正確工作。你可以點擊垃圾郵件,點擊窗口然後回來,或者等待事件,它最終會工作,但顯然它不是真的可用。下面是一個簡單的例子:如何使DataGrid上的RadioButton在排序後保持可用狀態?

using System.Data; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Controls.Primitives; 
using System.Windows.Data; 

namespace WpfApplication1 
{ 
    /// <summary> 
    /// Interaction logic for MainWindow.xaml 
    /// </summary> 
    public partial class MainWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
      InitializeDataGrid(); 
     } 

     private void InitializeDataGrid() 
     { 
      var table = GetTestTable(); 

      var newGrid = new DataGrid 
           { 
            CanUserAddRows = false, 
            CanUserSortColumns = true, 
            AutoGenerateColumns = true, 
            ItemsSource = table.AsDataView(), 
            DataContext = table 
           }; 
      newGrid.AutoGeneratingColumn += dataGrid_AutoGeneratingColumn; 

      UxRootGrid.Children.Add(newGrid); 
     } 

     private static DataTable GetTestTable() 
     { 
      DataTable table = new DataTable("name"); 
      table.Columns.Add("Include", typeof (bool)); 
      table.Columns.Add("Number", typeof (int)); 

      for (int i = 0; i < 5; i++) 
      { 
       var row = table.NewRow(); 
       row[0] = false; 
       row[1] = i; 
       table.Rows.Add(row); 
      } 
      return table; 
     } 

     void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) 
     { 
      if (e.PropertyName != "Include") 
      { 
       return; 
      } 

      DataTemplate template = GetDataTemplate(); 
      DataGridTemplateColumn templateColumn = new DataGridTemplateColumn 
                 { 
                  Header = "Include", 
                  CellTemplate = template, 
                  CellEditingTemplate = template, 
                 }; 
      e.Column = templateColumn; 
     } 

     private static DataTemplate GetDataTemplate() 
     { 
      var elementFactory = new FrameworkElementFactory(typeof (RadioButton)); 

      var binding = new Binding("Include") 
           { 
            Mode = BindingMode.TwoWay, 
            UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged 
           }; 

      elementFactory.SetBinding(ToggleButton.IsCheckedProperty, binding); 
      elementFactory.SetValue(RadioButton.GroupNameProperty, "BindingGroup"); 

      return new DataTemplate {VisualTree = elementFactory}; 
     } 
    } 
} 

這裏是XAML中:

<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"> 
    <StackPanel Name="UxRootGrid"> 
    </StackPanel> 
</Window> 

所以,看問題:
1.啓動的單選按鈕的應用程序
2.單擊旁邊編號1.
3.單擊「編號」標題兩次(按降序排序)。
4.現在單擊數字4旁邊的RadioButton。
5.請注意,Number 1旁邊的RadioButton現在取消選中,但Number 4旁邊的RadioButton未選中。
6.再次點擊Number 4旁邊的RadioButton。最終它將被選中。

更新:我有另一位同事在他的機器上試用了這個功能,並且花了他一兩次的排序/選擇單選按鈕來查看問題的發生,但最終他最終與我處於同一位置。

我對WPF很新,所以我希望這只是我的一個簡單的錯誤。任何幫助獲得解決方法或另一種方法來設置這將不勝感激。

+0

您是否檢查過綁定到「包含」的工作? 似乎對我來說,那個問題在那裏... – Dusan

+0

我沒有看到任何綁定錯誤(至少沒有錯誤出現在我的輸出中)。我假設綁定至少部分工作,因爲如果您更改 行[0] = false; 至 row [0] = true; 然後你會注意到它正確地填充了最後一個RadioBox。 – guxiyou

+0

@Bob,我嘗試做更新佈局作爲排序的一部分,但這似乎沒有幫助。你會建議在哪裏試圖補充一下? – guxiyou

回答

相關問題