2011-03-23 5 views
1

저는 학교에서 회사의 프로젝트를 진행하고 있으며 티켓 정보가있는 DataGrid를 만들어야합니다. ID 번호, 티켓 설명.checkboxcolumn DataGrid에 부울 값을 바인딩하는 방법 WPF

데이터베이스의 티켓 테이블에 '품목'열이 있으며 "인보이스 발행되지 않음", "인보이스 발행 됨"또는 "오퍼"값을 가질 수 있습니다. DataGrid의 세 번째 열은 checkboxcolumn이어야하며 상사는 체크 박스를 선택하면 티켓이 인보이스 발행되어야 함을 의미하며, 선택을 취소하면 "송장 발행하지 않음"또는 " 제안 ", 그건별로 중요하지 않습니다. 내 문제는 "ID"및 "설명"필드를 바인딩 할 때, 나는 'true 또는 false'필드로 checkboxcolumn을 바인딩하는 방법을 모르겠다? 나는 표에서 표 필드를 바인딩하는 방법 만 알고 있지만 불린 필드를 추가하여 코드에서 "청구될 때"를 결정할 수 있습니다. 부울 필드는 true이어야하고 송장을 발행하지 않아야합니다. 거짓이어야한다. 그래서 체크되지 않았다.

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

부울 목록에 대한 필요성을 이해하지 못합니다.

저는 변환기를 사용하고 속성에 직접 바인딩합니다. 다음과 같은 내용 :

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

+1 :-) 부울 값에 따라. ViewModel을 만들고 거기에 Issues 컬렉션을 노출하고 ViewModel을 MainWindow.DataContext로 설정하고 XAML에서 DataGrid를 선언하는 것이 좋습니다. –

+0

나는이 경우에 약간의 과잉 공격이 될 것으로 짐작하기 때문에 나는 멀리까지 가지 않았다.)하지만 당신은 당연한 것입니다 ... – David

+0

고마워요 !! 그것은 작동합니다! –

2

이전 답변 외에도 더 많은 XAML을 사용하는 것이 좋습니다. WPF의 가장 큰 장점은 쉽게 (MVVM 패턴 덕택에) & 모델을 독립적으로 볼 수 있다는 것입니다.

이 경우 사용자 정의 개체의 내용을 표시하는 DataGrid가 있습니다.

우선 데이터 바인딩 및 OnPropertyChanged 인터페이스에 익숙합니까? 그렇지 않다면 분명히 그것에 대해 더 많이 알아야합니다. 실제로 사용하기 쉽습니다.

내가하는 방법은 ViewModel에 표시 할 개체 목록이 들어있는 속성 "목록"을 추가하는 것입니다.

그렇다면, 당신은 당신의 데이터 그리드를 선언하고 목록에 바인딩 할 수 있습니다 :

<DataGrid ItemsSource="{Binding List}" > 

을 그리고 당신은 데이터 그리드에 무엇을 템플릿을 정의 할 수 있습니다. 이 경우 :

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

당신이 당신의 부울에있는 확인란을 결합하면, 직접 확인하거나됩니다하지

+2

+1 xaml은 (는) 인생입니다! :) 때로는 xaml과 함께 할 수 없으며 C#을 고수해야합니다. 이것은 어쨌든 여기에있는 것처럼 보이지 않으므로이 또한 가치가있을 것입니다. – David

+0

WPF 프로젝트가 처음으로 더 커지고 OnPropertyChanged에 대해 들었지만 아직 사용하지 않았습니다. 나는 그것을 시도 할 것이다. 고마워. –

+0

누군가가 DataGrid의 체크 박스 중 하나를 클릭하면 이벤트 핸들러에 액세스 할 수있는 방법을 알고 있습니까? 체크 박스 중 하나를 클릭하면 코드를 실행해야합니다. –

관련 문제