2016-04-03 24 views
1

我正在爲我自己編寫的一本食譜,用WPF/C#編寫。 另外我是新來的數據綁定。代碼中的Datagrids上的綁定背後的

我的問題是,我想在代碼後面的運行時在TabItem中生成一個Datagrid,包括綁定。我無法在XAML中設置Datagrid,因爲我想動態創建所有TabItem。

下面的代碼至今:

XAML:

<UniformGrid Columns="2" Rows="1"> 
<TabControl Name="TabControl" TabStripPlacement="Left"/> 
    <TabItem Header= "first dish" Name = "firstdish"/> 
</UniformGrid> 

XAML.cs的一代:

//New Grid 
     var Grid = new DataGrid(); 

     //Start Test list creation with three items 
     var TestList = new List<Receipt>(); 

     //Set binding 
     Grid.ItemsSource = TestList; 

     var Rec = new Receipt(); 
     Rec.Creator = "DaJohn1"; 
     Rec.ID = 1; 
     Rec.Title = "TestReceipt1"; 

     var Rec2 = new Receipt(); 
     Rec2.Creator = "DaJohn2"; 
     Rec2.ID = 2; 
     Rec2.Title = "TestReceipt2"; 

     var Rec3 = new Receipt(); 
     Rec3.Creator = "DaJohn3"; 
     Rec3.ID = 3; 
     Rec3.Title = "TestReceipt3"; 

     TestList.Add(Rec); 
     TestList.Add(Rec2); 
     TestList.Add(Rec3); 
     //End Test list creation 

     //Add Column 
     var SingleColumn = new DataGridTextColumn(); 
     Grid.Columns.Add(SingleColumn); 
     SingleColumn.Binding = new Binding("Creator"); 
     SingleColumn.Header = "Creator"; 

     //Add Column 
     var SingleColumn2 = new DataGridTextColumn(); 
     Grid.Columns.Add(SingleColumn2); 
     SingleColumn2.Binding = new Binding("Title"); 
     SingleColumn2.Header = "Title"; 

     //Set tabitem content to datagrid 
     firstdish.Content = Grid; 

所有我得到的是四排的數據網格(看起來像項目數量正確),這些都是空的,沒有數據可見。 自從上個星期一以來,我一直在盯着這個,並且無法在任何地方找到答案。

感謝您的任何想法和解決方案。

+0

Receipt類中的Creator變量是否爲public?爲了讓UI訪問它,它需要如下所示: public string Creator {get; set;} – Foxman

回答

0

嘗試改變

var TestList = new List<Receipt>(); 

var TestList = new ObservableCollection<Receipt>(); 

,因爲它會自動通知關於修改UI。 我有一個similar problem項目沒有渲染,所以這可能是它。

+0

這沒有做任何改變,對不起。 – DaJohn

0

我已經採取了你的代碼並檢查了你做的一些事情:主要的錯誤是你的xaml代碼中你創建了Tab控件然後把TabItem放在它外面,Tabitem必須在它的控制之內正常工作。所以第一個錯誤是:

你需要之前在我看來,事情做
<TabControl Name="TabControl" TabStripPlacement="Left"> 
<TabItem Header="First dish" Name = "firstdish" /> 
</TbControl> 

其他的事情是:

  • 指定的窗口或其他UI元素本身的datacontext
  • 確認您的收款分類實現必須通過其所有屬性引發的INotifyPropertyChanged事件,或者將屬性實現爲DependencyProperties(即使後者不是必需的)
  • 在ObservableCollection中轉換數據源TestList
  • 創建TestList其作爲類屬性不是一個局部變量,使其進入的datacontext

我做了使用上述指示和你的代碼,讓你看得更清楚該如何工作的一小部分。你可以在這裏下載的zip: TestClassDataGrid.zip

0

下面的代碼應該爲你工作,

XAML:

<TabControl Name="TabControl" TabStripPlacement="Left"> 
     <TabItem Header= "first dish" Name = "firstdish"/> 
    </TabControl> 

。cs文件

public Window() 
     { 
      InitializeComponent(); 

      var Grid = new DataGrid(); 

      //Start Test list creation with three items 
      var TestList = new List<Receipt>(); 

      //Set binding 
      Grid.ItemsSource = TestList; 

      var Rec = new Receipt(); 
      Rec.Creator = "DaJohn1"; 
      Rec.ID = 1; 
      Rec.Title = "TestReceipt1"; 

      var Rec2 = new Receipt(); 
      Rec2.Creator = "DaJohn2"; 
      Rec2.ID = 2; 
      Rec2.Title = "TestReceipt2"; 

      var Rec3 = new Receipt(); 
      Rec3.Creator = "DaJohn3"; 
      Rec3.ID = 3; 
      Rec3.Title = "TestReceipt3"; 

      TestList.Add(Rec); 
      TestList.Add(Rec2); 
      TestList.Add(Rec3); 
      //End Test list creation 

      //Add Column 
      var SingleColumn = new DataGridTextColumn(); 
      Grid.Columns.Add(SingleColumn); 
      SingleColumn.Binding = new Binding("Creator"); 
      SingleColumn.Header = "Creator"; 

      //Add Column 
      var SingleColumn2 = new DataGridTextColumn(); 
      Grid.Columns.Add(SingleColumn2); 
      SingleColumn2.Binding = new Binding("Title"); 
      SingleColumn2.Header = "Title"; 

      //Set tabitem content to datagrid 

      Grid.AutoGenerateColumns = false; 
      firstdish.Content = Grid; 
     }