2017-08-11 82 views
0

我有綁定到一個DataTable一個DataGrid,我已經叫「GridCollection」:通過動態DataGrid列設置爲組合框列中的數據綁定

<!--DataGrid--> 
    <DataGrid Name="DataGrid" ItemsSource="{Binding GridCollection}" > 
     <DataGrid.Columns> 
      <DataGridTemplateColumn> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <ComboBox ItemsSource="{Binding SelectionOptions}"> 
           <ComboBox.Style> 
            <Style TargetType="ComboBox"> 
             <Setter Property="Visibility" Value="Collapsed"/> 
             <Style.Triggers> 
              <DataTrigger Binding="{Binding Caption, Mode=TwoWay}" Value="ShowComboBox"> 
               <Setter Property="Visibility" Value="Visible"/> 
              </DataTrigger> 
             </Style.Triggers> 
            </Style> 
           </ComboBox.Style> 
          </ComboBox> 
         </StackPanel> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

我希望能夠動態地更新DataGrid列單元格顯示組合框的模板。

我試圖通過添加DataTrigger綁定到DataTable列的屬性(「標題」),然後更新相應的組合框的可見性來實現此目的。

我的理解是DataContext在這種情況下是DataTable的列。

我試圖設置DataTable的列以匹配DataTrigger(「ShowComboBox」)speicified的值的「標題」屬性:

ViewModel.GridCollection.Columns[index].Caption = "ShowComboBox"; 

確認正在執行這行代碼,並且後Caption屬性正在更新,這仍然不會更改DataGrid。沒有列顯示組合框。

我不確定綁定是否存在問題,或者是否是別的。

任何幫助表示讚賞!

回答

1

由於DataColumn沒有實現INotifyPropertyChanged接口和將屬性更改通知提交給WPF,這不起作用。

不過,若你一列添加到DataTable並綁定到這一個,它的工作:

ViewModel.GridCollection.Columns.Add(new DataColumn("Caption")); 

的不同之處在於DataRowView類實現INotifyPropertyChanged接口。這是WPF必須能夠偵聽對源屬性的更改並動態更新視圖所必需的。

+0

謝謝。我假定DataColumn實現INotifyPropertyChanged,因爲DataGrid的其餘部分正在更新。好像DataTable至少實現了它......我遇到的問題是列名是從文件中讀取的,並且無法知道哪些列需要在組合框列之前運行。有什麼辦法可以在不知道列名或索引的情況下在XAML中編寫此綁定? –

+0

你指的是爲什麼綁定?哪部分是動態的?難道你不能像我在我的回答中所建議的那樣動態添加Caption列嗎? – mm8

+0

列標題是動態的(實際上,整個表是從文件讀入的)。我的代碼中的「Caption」是單個DataColumn的屬性,而不是Column的標題名稱。我需要綁定到DataColumn的屬性。這就是我指的綁定。 –

0

如果更改佈局,則需要重置綁定。 從您的datagrid中刪除綁定/數據源。更改標題值並將源再次綁定到您的數據網格。

下面這對我的作品的代碼:

的窗口

Window x:Class="WpfApplication7.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:local="clr-namespace:WpfApplication7" 
    mc:Ignorable="d" 
    Title="MainWindow" Height="350" Width="525" Loaded="Window_Loaded"> 
<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <DataGrid Name="grd" AutoGenerateColumns="False" ItemsSource="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType=Window}, Path=DataContext}"> 
     <DataGrid.Columns> 
      <DataGridTextColumn Header="01" Binding="{Binding Name}" /> 
      <DataGridTextColumn Header="02" Binding="{Binding LastName}" /> 
      <DataGridTemplateColumn Header="CBX"> 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <ComboBox> 
          <ComboBox.Style> 
           <Style TargetType="ComboBox"> 
            <Style.Triggers> 
             <DataTrigger Binding="{Binding Path=Caption, Mode=TwoWay}" Value="ShowCombobox"> 
              <Setter Property="Visibility" Value="Collapsed" /> 
             </DataTrigger> 
            </Style.Triggers> 
           </Style> 
          </ComboBox.Style> 
         </ComboBox> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
    <Button Content="Click" Click="Button_Click" Grid.Row="1"/> 
</Grid> 
</Window> 

的XAML代碼背後:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Windows.Documents; 
using System.Windows.Input; 
using System.Windows.Media; 
using System.Windows.Media.Imaging; 
using System.Windows.Navigation; 
using System.Windows.Shapes; 

namespace WpfApplication7 
{ 
/// <summary> 
/// Interaktionslogik für MainWindow.xaml 
/// </summary> 
public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Window_Loaded(object sender, RoutedEventArgs e) 
    { 

     items soureitems = new items(); 

     for(int i = 0; i <= 10; i++) 
     { 
      item sourceitem = new item(); 
      sourceitem.Name = "John"; 
      sourceitem.LastName = "Doe"; 
      sourceitem.Caption = ""; 
      soureitems.Add(sourceitem); 
     } 

     this.DataContext = soureitems; 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 

     items sourceitems = (items)(this.DataContext); 
     this.DataContext = null; 
     foreach (item sourceitem in sourceitems) 
     { 
      if(sourceitem.Caption != "ShowCombobox") 
      { 
       sourceitem.Caption = "ShowCombobox"; 
      } else 
      { 
       sourceitem.Caption = ""; 
      } 
     } 
     this.DataContext = sourceitems; 
    } 
} 

public class items : System.Collections.ObjectModel.ObservableCollection<item> { } 

public class item 
{ 
    string _Name; 
    string _LastName; 
    string _Caption; 
    public string Name { 
     get { return _Name; } 
     set { _Name = value; } 
    } 
    public string LastName 
    { 
     get { return _LastName; } 
     set { _LastName = value; } 
    } 
    public string Caption 
    { 
     get { return _Caption; } 
     set { _Caption = value; } 
    } 
} 
} 
相關問題