【问题标题】:How to create a DatagridTemplateColumn with checkbox and binding to a datasouce?如何使用复选框创建 DatagridTemplateColumn 并绑定到数据源?
【发布时间】:2018-08-15 23:28:46
【问题描述】:

如果我忽略了某些事情,请提前道歉 - 我仍然发现我的脚在使用 Xaml 而不是 Windows 窗体。

我正在尝试将数据源绑定到其中一列是复选框的 DataGrid。我的原始解决方案对此效果很好,但需要用户双击复选框:

<Window x:Class="ExecBoxInvoices.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="507" Width="676">
<Grid Margin="0,0,0,51">
    <DataGrid x:Name="InvoiceDG" HorizontalAlignment="Left" Height="165" Margin="134,251,0,0" VerticalAlignment="Top" Width="400" ItemsSource="{Binding}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Header="Generate" Binding="{Binding Generate}" Width="80"/>
            <DataGridTextColumn Header="Table_Number" Binding="{Binding Table_Number}" Width="120"/>
            <DataGridTextColumn Header="Transaction_Date" Binding="{Binding Transaction_Date}" Width="175"/>
            <DataGridTextColumn Header="Transaction_ID" Visibility="Hidden" Binding="{Binding Transaction_ID}"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

单击复选框的新解决方案如下所示,但不起作用(Binding="{Binding Generate}"上显示错误):

<Window x:Class="ExecBoxInvoices.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="507" Width="676">
<Grid Margin="0,0,0,51">
    <DataGrid x:Name="InvoiceDG" HorizontalAlignment="Left" Height="165" Margin="134,251,0,0" VerticalAlignment="Top" Width="400" ItemsSource="{Binding}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTemplateColumn Header="Generate" Width="60" Binding="{Binding Generate}">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <CheckBox IsChecked="{Binding Path=IsSelected, UpdateSourceTrigger=PropertyChanged}"/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
            <DataGridTextColumn Header="Table_Number" Binding="{Binding Table_Number}" Width="120"/>
            <DataGridTextColumn Header="Transaction_Date" Binding="{Binding Transaction_Date}" Width="175"/>
            <DataGridTextColumn Header="Transaction_ID" Visibility="Hidden" Binding="{Binding Transaction_ID}"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

供参考,用于设置来源的代码为:

InvoiceDG.ItemsSource = recordCollection;

其中 recordCollection 是一个列表:

class InvoiceRow
{
    public bool Generate { get; set; }
    public string Table_Number { get; set; }
    public string Transaction_Date { get; set; }
    public string Transaction_ID { get; set; }

    public InvoiceRow(bool generate, string table_Number, string transaction_Date, string transaction_ID)
    {
        this.Generate = generate;
        this.Table_Number = table_Number;
        this.Transaction_Date = transaction_Date;
        this.Transaction_ID = transaction_ID;
    }
}

【问题讨论】:

  • 哪种 XAML 风格?您是在编写桌面应用程序还是手机应用程序? WPF、Silverlight 还是 Windows 应用商店应用 (WinRT)?
  • 桌面应用程序,WPF(Visual Studio 2012)

标签: c# wpf xaml checkbox


【解决方案1】:

试试这个:

<DataGridTemplateColumn Header="Generate" Width="60">
     <DataGridTemplateColumn.CellTemplate>
           <DataTemplate>
                <CheckBox IsChecked="{Binding Generate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
           </DataTemplate>
     </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

【讨论】:

  • 这段代码编译,并创建一个单击复选框,但遗憾的是没有反映对数据源的更改:(我已经更新了原始帖子以显示数据源的设置位置。
  • 使用 UpdateSourceTrigger:
  • 不应该是“{Binding Generate, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}”
  • 天哪,这对我来说刚刚结束了数小时的盲目试验和错误。谢谢!但是为什么需要 UpdateSourceTrigger=PropertyChanged 呢?普通复选框不需要。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-04
  • 2013-09-04
  • 2019-05-29
  • 1970-01-01
相关资源
最近更新 更多