【问题标题】:WPF Datagrid bind data list to a template column comboboxWPF Datagrid 将数据列表绑定到模板列组合框
【发布时间】:2020-06-02 23:21:57
【问题描述】:

我一直在寻找有关如何将数据绑定到数据网格模板列中的组合框的几个小时。我在网站上找到了一些,但似乎没有任何效果。这是我到目前为止所做的:

public partial class CashReceipt : UserControl
    {
        private ObservableCollection<CashItem> itemsList;
        private ObservableCollection<string> accounts;
        public CashReceipt()
        {
            InitializeComponent();

            itemsList = new ObservableCollection<CashItem>();
            accounts = new ObservableCollection<string>()
            {
                "5710",
                "6010",
                "6510",
                "7010"
            };

            for (int i = 0; i < 5; ++i)
            {
                CashItem item = new CashItem();
                itemsList.Add(item);
            }

            clDatagrid.ItemsSource = itemsList;
        }
    }

    public struct CashItem
    {
        public string account { get; set; }
        public string description { get; set; }
        public decimal amount { get; set; }
    }
}

XAML 是

<UserControl x:Class="CashLedgerApp.CashReceipt"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:CashLedgerApp"
             mc:Ignorable="d" 
             MinHeight="320" HorizontalAlignment="Stretch">
    <UserControl.Resources>
        <CollectionViewSource x:Key="AccountsList" Source="{Binding Path=accounts}"/>
    </UserControl.Resources>
    <Border Margin="100,20" BorderBrush="gray" BorderThickness="0.5">
        <Grid Background="White">
            <DataGrid x:Name="clDatagrid" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="8" Margin="10,0" VerticalAlignment="Stretch" MinHeight="30" AutoGenerateColumns="False" RowHeaderWidth="0" IsReadOnly="False" CanUserAddRows="True">
                <DataGrid.Resources>
                    <Style BasedOn="{StaticResource {x:Type DataGridColumnHeader}}" TargetType="{x:Type DataGridColumnHeader}">
                        <Setter Property="HorizontalContentAlignment" Value="Center" />
                        <Setter Property="Height" Value="30"/>
                        <Setter Property="Background" Value="Black"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="BorderBrush" Value="White"/>
                        <Setter Property="BorderThickness" Value="0,0,1,0"/>
                    </Style>
                </DataGrid.Resources>
                <DataGrid.Columns>
                    <!--<DataGridComboBoxColumn x:Name="clAccount" Header="Compte No" Width="1*" SelectedValuePath="{Binding account}" SelectedValueBinding="{Binding Path=account}"/>-->
                    <DataGridTemplateColumn Header="Compte No" Width="1*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding Source={StaticResource AccountsList}}"
                                          SelectedItem="{Binding account}"
                                          DisplayMemberPath="account"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="Description" Width="3*" Binding="{Binding description}"/>
                    <DataGridTextColumn Header="Montant" Width="1.5*" Binding="{Binding amount}">
                        <DataGridTextColumn.HeaderStyle>
                            <Style TargetType="DataGridColumnHeader">
                                <Setter Property="Background" Value="Black"/>
                                <Setter Property="Foreground" Value="White"/>
                                <Setter Property="HorizontalContentAlignment" Value="Center"/>
                                <Setter Property="BorderThickness" Value="0"/>
                            </Style>
                        </DataGridTextColumn.HeaderStyle>
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Border>
</UserControl>

当我执行这个程序时,模板列中的组合框总是空的。 accounts 列表中的数据只是一个示例,可以让事情顺利进行。我将在代码的最终版本中使用数据库中的数据。但我需要先让它工作。 谢谢。

更新 我按照@ASh 的建议进行了更改,这里是 C# 和 XAML(我向 itemList 集合添加了一些数据,正如预期的那样,这些数据显示在网格中,但 @ 中的 ComboBox 987654324@ 还是空的):

public partial class CashReceipt : UserControl
    {
        public ObservableCollection<CashItem> itemsList;
        public ObservableCollection<string> Accounts;
        public CashReceipt()
        {
            InitializeComponent();

            itemsList = new ObservableCollection<CashItem>();
            Accounts = new ObservableCollection<string>()
            {
                "5710",
                "6010",
                "6510",
                "7010"
            };

            for (int i = 0; i < 5; ++i)
            {
                CashItem item = new CashItem();
                item.description = "Achats";
                item.amount = 250000;
                itemsList.Add(item);
            }

            clDatagrid.ItemsSource = itemsList;
        }
    }

    public struct CashItem
    {
        public string account { get; set; }
        public string description { get; set; }
        public decimal amount { get; set; }
    }

<UserControl x:Class="CashLedgerApp.CashReceipt"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:CashLedgerApp"
             mc:Ignorable="d" 
             MinHeight="320" HorizontalAlignment="Stretch">
    <UserControl.Resources>
        <CollectionViewSource x:Key="AccountsList" Source="{Binding Path=Accounts, RelativeSource={RelativeSource AncestorType=UserControl}}"/>
    </UserControl.Resources>
    <Border Margin="100,20" BorderBrush="gray" BorderThickness="0.5">
        <Grid Background="White">
            <DataGrid x:Name="clDatagrid" Grid.Row="3" Grid.Column="0" Grid.ColumnSpan="8" Margin="10,0" VerticalAlignment="Stretch" MinHeight="30" AutoGenerateColumns="False" RowHeaderWidth="0" IsReadOnly="False" CanUserAddRows="True">
                <DataGrid.Resources>
                    <Style BasedOn="{StaticResource {x:Type DataGridColumnHeader}}" TargetType="{x:Type DataGridColumnHeader}">
                        <Setter Property="HorizontalContentAlignment" Value="Center" />
                        <Setter Property="Height" Value="30"/>
                        <Setter Property="Background" Value="Black"/>
                        <Setter Property="Foreground" Value="White"/>
                        <Setter Property="BorderBrush" Value="White"/>
                        <Setter Property="BorderThickness" Value="0,0,1,0"/>
                    </Style>
                </DataGrid.Resources>
                <DataGrid.Columns>
                    <DataGridTemplateColumn Header="Compte No" Width="1*">
                        <DataGridTemplateColumn.CellTemplate>
                            <DataTemplate>
                                <ComboBox ItemsSource="{Binding Source={StaticResource AccountsList}}"
                                          SelectedItem="{Binding account}"
                                          DisplayMemberPath="account"/>
                            </DataTemplate>
                        </DataGridTemplateColumn.CellTemplate>
                    </DataGridTemplateColumn>
                    <DataGridTextColumn Header="Description" Width="3*" Binding="{Binding description}"/>
                    <DataGridTextColumn Header="Montant" Width="1.5*" Binding="{Binding amount}">
                        <DataGridTextColumn.HeaderStyle>
                            <Style TargetType="DataGridColumnHeader">
                                <Setter Property="Background" Value="Black"/>
                                <Setter Property="Foreground" Value="White"/>
                                <Setter Property="HorizontalContentAlignment" Value="Center"/>
                                <Setter Property="BorderThickness" Value="0"/>
                            </Style>
                        </DataGridTextColumn.HeaderStyle>
                    </DataGridTextColumn>
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Border>
</UserControl>

我可能错过了一些我认为但不知道是什么。

【问题讨论】:

  • public ObservableCollection&lt;string&gt; Accounts; - 你仍然缺少 getter 和 setter:public ObservableCollection&lt;string&gt; Accounts { get; private set; }

标签: c# .net wpf


【解决方案1】:

如果您将accounts 设为公共属性(目前它是私有字段),则绑定{Binding Path=accounts} 将起作用

public ObservableCollection<string> accounts { get; private set; }

还有命名约定建议它应该变成Accounts(和{Binding Path=Accounts}

另外简单的 Binding 在 DataContext 中搜索属性,但在您的情况下 Accounts 是 UserControl 本身的属性,因此有必要更改 Binding 的来源:

<CollectionViewSource x:Key="AccountsList" 
                      Source="{Binding Path=Accounts, RelativeSource={RelativeSource AncestorType=UserControl}}"/>

【讨论】:

  • 您好,我将 ''accounts'' 更改为 ''Accounts'' 并公开。但什么都没有改变。我也在“绑定”中更改了它
  • @Patrik,我添加了详细信息
猜你喜欢
  • 1970-01-01
  • 2011-10-14
  • 2016-03-26
  • 2022-10-07
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
相关资源
最近更新 更多