2016-09-27 3 views
0

현재 C# WPF DataGrid으로 작업 중입니다.
DataGrid은 (는) 데이터베이스를 ItemsSource으로 사용하고 있으며 주문 번호는 DataGrid입니다. 예
:셀의 가변 값을 기준으로 DataGrid 행의 배경을 설정하는 방법

BIG BURGER 1
BIG MAC 1
버거 1

맥 너겟 2
CHICKEN 2
코카콜라 2
PEPSI 2

로서 너는 내가 각 주문서의 물건을 열거하고 있음을 알 수있다. 각 항목 옆에 숫자 1 또는 숫자 2가 있습니다.이 숫자는 어느 항목이 어떤 순서에 속하는지 의 방향을 맞추도록 도와줍니다.

제 질문은 항목이 특정 주문에 속하는 방법입니다 (예 : 항목이 주문 1과 연결될 때 빨간색, 항목이 주문 2와 연결될 때 파란색). 또는 각 주문의 마지막 행만 페인트 할 수도 있습니다 (아래 굵은 글씨 부분을보십시오).

어떻게 든 그들을 분리해야합니다. 왜냐하면 내가 데이터 그리드에로드 할 때 더러워 보일 테니까요.

이 상상해

BIG BURGER 1 BIG MAC 1
버거 1
맥 너겟 2
CHICKEN 2
코카콜라 2
PEPSI 2
BIG BURGER 3
BIG MAC 3
버거 3
맥 너겟 3
CHICKEN 4
코카콜라 4
PEPSI 4

그것은 매우 지저분 보인다 ..

(앞에서 말했듯이, 각 행의 마지막 행만 페인트 할 수 있습니다. 전체 행을 사용할 수없는 경우 화면에서 눈에 띄는 간격을 만들 수 있습니다.)

이것은 내가 지금까지 무엇을 가지고 있지만 하드 코딩 값을 사용하기 때문에이 최적되지 않습니다 : BEHIND

<DataGrid.RowStyle> 
     <Style TargetType="DataGridRow"> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding NumberOfOrder}" Value="1"> 
        <Setter Property="Background" Value="Red"></Setter> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding NumberOfOrder}" Value="2"> 
        <Setter Property="Background" Value="Green"></Setter> 
       </DataTrigger> 
       <DataTrigger Binding="{Binding NumberOfOrder}" Value="3"> 
        <Setter Property="Background" Value="Orange"></Setter> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
</DataGrid.RowStyle> 

CODE :

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     try 
     { 
      InitializeComponent(); 
      this.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
      this.WindowState = WindowState.Maximized; 

      datagrid1.ItemsSource = OrdersController.localOrders(); 
     } 
     catch(Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
} 
다음

당신은 내가 사용하고 볼 수 있듯이을 하드 코딩 된 값, 내 NumberOfOrder이 1,2 또는 3 인 경우 다음 :페인트 행, 그리고 이것은에 대해 여러 가지 값이 있으므로 좋지 않습니다.. 매트의 대답 AFTER

편집 :

public MainWindow() 
{ 
InitializeComponent(); 

    CollectionViewSource collectionViewSource = new CollectionViewSource(); 

    var ordersList = OrdersController.localOrders(); //ORDERS LIST 

    collectionViewSource.Source = new List<OrdersController.OrdersLocal>() 
    { 
     foreach(var item in ordersList) 
     { 
      new OrdersController.OrdersLocal() {Title = item.Title, NumberOfOrder = item.NumberOfOrder, Desc = item.Desc, User = item.User } 
     } 

    }; 

    collectionViewSource.GroupDescriptions.Add(new PropertyGroupDescription("NumberOfOrder")); 

    DataContext = collectionViewSource; 
} 
+0

.. ..Anyone를? :( –

+0

아 이제 알았습니다 ;-) 훨씬 더 간단하게 할 수 있습니다 : collectionViewSource.Source = ordersList; 또는 OrdersLocal 클래스를 사용하려는 경우 LINQ 쿼리를 수행 할 수 있습니다. collectionViewSource.Source = ordersList.Select (x => new OrdersLocal() {Title = x.Title}); – Mat

+0

감사합니다. 멋지다. 주문을 접었을 때 앱을 사용하는 사람이 주문이 축소 되어도 내용을 볼 수 있도록 텍스트 (예 : 각 그룹의 헤더 텍스트와 같은)를 넣을 수 있습니다. 예를 들어 나는 붕괴를 클릭하지만 다음과 같은 텍스트를보고 싶습니다 : numberofOrder, 그래서 내가 축소 된 순서를 맞출 수 있습니다 :) –

답변

1

당신은 NumberOfOrder하여 CollectionViewSource 및 그룹을 사용할 수 있습니다 XAML :

 <DataGrid ItemsSource="{Binding}" > 
     <DataGrid.GroupStyle> 
      <!-- Style for groups at top level. --> 
      <GroupStyle> 
       <GroupStyle.ContainerStyle> 
        <Style TargetType="{x:Type GroupItem}"> 
         <Setter Property="Template"> 
          <Setter.Value> 
           <ControlTemplate TargetType="{x:Type GroupItem}"> 
            <Expander IsExpanded="True"> 
             <Expander.Header> 
              <DockPanel> 
               <TextBlock FontWeight="Bold" 
                  Text="{Binding Path=Name}" /> 
              </DockPanel> 
             </Expander.Header> 
             <Expander.Content> 
              <ItemsPresenter /> 
             </Expander.Content> 
            </Expander> 
           </ControlTemplate> 
          </Setter.Value> 
         </Setter> 
        </Style> 
       </GroupStyle.ContainerStyle> 
      </GroupStyle> 
     </DataGrid.GroupStyle> 
    </DataGrid> 

코드 숨김 :

CollectionViewSource collectionViewSource = new CollectionViewSource(); 
     collectionViewSource.Source = new List<RowItem>() 
      { 
       new RowItem() {NumberOfOrder =1, Name ="kong foo" }, 
       new RowItem() {NumberOfOrder =1,Name ="asdf" }, 
       new RowItem() {NumberOfOrder =2,Name ="asdf" }, 
       new RowItem() {NumberOfOrder =3,Name ="foo"} 
      }; 


     collectionViewSource.GroupDescriptions.Add(new PropertyGroupDescription("NumberOfOrder")); 

     DataContext = collectionViewSource; 
+0

추가 읽기 : https://msdn.microsoft.com/en-us/library/ff407126(v=vs.110).aspx – Mat

+0

매트, 당신은 정말 유용했습니다! 곧 나는 코드를 게시 할 것이고, 나는 아직도 문제가있다. 그러나 나는 이것을 해결하려고 노력할 것이다! –

+0

매트, 어떻게 여기에 foreach 루프를 적용 할 수 있습니다, 당신은 내가 네 개의 개체로 이것을 해결할 수있는 방법을 보여 줬지만, 나는 데이터베이스에 많은 객체가 있다고 상상하고 어떻게 각 객체를 루프하여 새로운 RowItem으로 추가 할 수 있습니까? , 나는 allready 시도했지만 말합니다 : "INVALID INITIALIZER ..." –

0

는 순서는 A에 따라 배경) 주문 번호와 b) 마지막 행을 변경하기 위해 MultiDataTrigger를 사용합니다. 모델에 해당 행이 해당 주문의 마지막 행인지 여부를 나타내는 속성을 추가하려고합니다. 이 (안된) 같은

시도 뭔가 :

<Style.Triggers> 
    <MultiDataTrigger> 
     <MultiDataTrigger.Conditions> 
      <Condition Binding="{Binding NumberOfOrder}" Value="1" /> 
      <Condition Binding="{Binding IsLastRow}" Value="True" /> 
     </MultiDataTrigger.Conditions> 
     <Setter Property="Background" Value="Red" /> 
    </MultiDataTrigger> 
    ... 
</Style.Triggers>     
+0

아니요,이 방법으로 작동하지 않습니다.// 5 개 주문을 동시에로드하면 어떻게됩니까? ? IsLastRow는 각 주문의 마지막 행을 인식해야합니까? 페인트 칠해? –

+0

나는 그것이 당신이 원했던 것, 각 주문이 다른 마지막 행이라고 생각했습니다. 원하는게 뭐야? 빈 행? – leetibbett

+0

나는 모든 주문이 같은 시간에 오더라도 각 주문의 마지막 행을 인식해야합니까? (예 : 5 개의 주문), 그 방법은 여전히 ​​어떤 행이 서로의 마지막 행인지 인식하고 페인트합니다. –

1

당신은 그렇게 할 값 변환기 바인딩을 사용을 시도 할 수 있습니다.

내가 셀 스타일이 방법을 해냈어 :

<Style TargetType="DataGridCell"> 
    <Setter Property="Background" 
      Value="{Binding State, Converter={x:Static l:Converters.CoupleStateConverter}}" /> 
        </Style> 

그래서 상태 (내 예 INT)에 따라 컨버터를 반환 배경 색상. 이것은 당신이 필요로하는 것과 비슷합니다.

위에서 보았 듯이 셀의 데이터 컨텍스트는 행의 값이므로 내 예제에서는 Property State에 바인딩 할 수 있습니다. 그 행에 대해 유효하다고 가정하므로 데이터 컨텍스트가이 행에 표시 될 항목이됩니다.