Как связать логическое значение с таблицей флажков - PullRequest
1 голос
/ 23 марта 2011

Я работаю над проектом в компании для школы, и мне нужно создать сетку данных с информацией о тикете: идентификационный номер, описание тикета.

В моей Tickettable в базе данных у меня есть столбец «Товар», и он может иметь значения: «Не для выставления счета», «Для выставления счета» или «Предложение». 3-й столбец в таблице данных должен быть флажком-флажком, и мой начальник хочет, чтобы у меня была возможность установить флажок, это означает, что билет должен быть выставлен на оплату, а когда я сниму флажок, это означает, что «счет не выставляется» или « предложение ", это не имеет значения. Моя проблема заключается в том, что, когда я связываю поля «ID» и «Description», я не знаю, как связать столбец checkbox с полем «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 ]

2 голосов
/ 23 марта 2011

В дополнение к предыдущему ответу я бы посоветовал вам использовать больше 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 с вашим логическим значением, оно будет проверено напрямую или нет, в соответствии с логическим значением: -)

2 голосов
/ 23 марта 2011

Я не совсем понимаю вашу потребность в булевом списке.

Я бы использовал конвертер и связывался напрямую с собственностью. Примерно так:

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