2017-08-11 34 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; } 
    } 
} 
} 
相关问题