首页 文章

通过数据绑定动态地将DataGrid列设置为ComboBox列

提问于
浏览
0

我有一个绑定到DataTable的DataGrid,我称之为“GridCollection”:

<!--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列的属性(“Caption”),然后相应地更新组合框的可见性来实现此目的 .

我的理解是,在这种情况下,DataContext是DataTable的列 .

我已经尝试设置DataTable列的“Caption”属性以匹配DataTrigger(“ShowComboBox”)中指定的值:

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

在确认正在执行此代码行并且正在更新Caption属性之后,仍然没有对DataGrid进行任何更改 . 没有列显示组合框 .

我不确定绑定是否存在问题,或者是否是其他问题 .

任何帮助表示赞赏!

2 回答

  • 1

    由于 DataColumn 未实现INotifyPropertyChanged接口并将属性更改通知引发到WPF,因此无法使用 .

    但是,如果您向 DataTable 添加一列并绑定到此列,它将起作用:

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

    区别在于 DataRowView 类实现了 INotifyPropertyChanged 接口 . 这是WPF能够侦听源属性的更改并动态更新视图所必需的 .

  • 0

    如果更改布局,则需要重置绑定 . 从datagrid中删除绑定/数据源 . 更改 Headers 值并将源再次绑定到您的数据网格 .

    这里代码对我有用:

    窗口的XAML

    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>
    

    背后的代码:

    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; }
        }
    }
    }
    

相关问题