我正在公司的一个项目上学,我必须使用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;
有人可以帮我吗?
提前致谢
答案 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绑定到布尔值,则会根据布尔值直接检查它: - )