如何将布尔值绑定到checkboxcolumn datagrid WPF

时间:2011-03-23 08:11:59

标签: wpf binding wpfdatagrid

我正在公司的一个项目上学,我必须使用ticketinformation制作一个数据网格:id-number,票证说明。

在我的数据库中的Tickettable中,我有一个列'Item',它可以包含以下值:“不开发票”,“要开票”或“提供”。数据网格中的第3列必须是复选框列,我的老板要求我检查复选框,这意味着必须开票,当我取消选中时,表示“不开票”或“提供“,这并不重要。我的问题是当我绑定“ID”和“描述”字段时,我不知道如何将checkboxcolumn与'true或false'字段绑定?我只知道如何从Ticket绑定表字段,但我想添加一个布尔字段,以便我可以在代码中确定它是“要开发票”时,我的布尔字段必须为真,当它不开发票时,它必须是假的,所以不加以控制。

dgTickets.DataContext = new List<ISSUE>(); 
dgTickets.Columns.Add(new DataGridTextColumn { Header = "Id", Binding = new Binding("IM_ISSUE_NO") }); 
dgTickets.Columns.Add(new DataGridTextColumn { Header = "Description", Binding = new Binding("IM_DESCRIPTION") }); 
DataGridCheckBoxColumn chk = new DataGridCheckBoxColumn();
chk.Header = "To be invoiced?";
List<ISSUE> lTickets = new List<ISSUE>(); 
lTickets = _ISSUEBO.getTickets(); 

//here I want to make a list of booleans when the tickets are 'to be invoiced or not' in the database
List<bool> lChecks = new List<bool>(); 
int intTeller = 0; 
bool boolFact = false;
foreach (ISSUE i in lTickets) {
switch (i.IM_ITEM_CODE) { 
case "TO BE INVOICED": 
boolFact = true; 
break; 
case "NOT TB INVOICED": 
boolFact = false; 
break; 
case "OFFER":
boolFact = false; 
break; 
default: break; 
} 
lChecks.Add(boolFact);
intTeller++; 
} 
Binding b = new Binding("lChecks"); //??? this is probably wrong, but i don't know how to do
chk.Binding = b;
this.dgTickets.Columns.Add(chk); 
dgTickets.ItemsSource = lTickets;

有人可以帮我吗?

提前致谢

2 个答案:

答案 0 :(得分:2)

我真的不明白你对布尔列表的需要。

我使用转换器直接绑定到属性。像这样:

   public partial class MainWindow : Window
   {
      public MainWindow()
      {
         InitializeComponent();

            DataGrid dgTickets = new DataGrid();

            ObservableCollection<ISSUE> Issues = new ObservableCollection<ISSUE>(); // better an ObservableCollection than a List here, so that it updates correctly when you modify the content.

            dgTickets.DataContext = Issues;

            dgTickets.Columns.Add(new DataGridTextColumn { Header = "Id", Binding = new Binding("IM_ISSUE_NO") });
            dgTickets.Columns.Add(new DataGridTextColumn { Header = "Description", Binding = new Binding("IM_DESCRIPTION") });
            dgTickets.Columns.Add(new DataGridCheckBoxColumn {
                Header = "To be invoiced?",
                Binding = new Binding("IM_ITEM_CODE") { Converter = new ItemCodeToBoolConverter() }
            });

      }
   }

    /// <summary>
    /// converts the item code string into a boolean
    /// </summary>
    public class ItemCodeToBoolConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            string itemCode = (string)value;

            return (itemCode == "TO BE INVOICED");
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            bool toBeInvoiced = (bool)value;

            return toBeInvoiced ? "TO BE INVOICED" : "NOT TB INVOICED OR OFFER";
        }
    }

答案 1 :(得分:2)

除了上一个答案,我建议你使用更多的XAML。 WPF的最大优势在于您可以轻松拥有独立的视图和视频。模型(感谢MVVM模式)

在这种情况下,你有一个显示自定义对象内容的DataGrid,对吗?

首先,您熟悉数据绑定和OnPropertyChanged接口吗?如果没有,你一定要尝试了解更多,这很容易使用。

我这样做的方法是在ViewModel中添加一个属性“list”,其中包含要显示的对象列表。

然后,您可以声明您的数据网格并将其绑定到列表:

<DataGrid ItemsSource="{Binding List}" >

您可以为数据网格中的内容定义模板。在这种情况下:

<DataGrid.Columns>
   <!-- definition of the previous columns -->
   <DataGridCheckBoxColumn>
      <!-- Details on your checkbox here --> 
   </DataGridCheckBoxColumn> 
</DataGrid.Columns>

如果将checkBox绑定到布尔值,则会根据布尔值直接检查它: - )