2014-01-07 3 views
0

DataGrid가 포함 된 WPF 응용 프로그램이 있습니다. Orders라는 목록이 포함 된 OrderBlock이라는 개체가 있습니다. 이 목록은 내 DataGrid에 바인딩되어 있습니다.WPF Datagrid 바인딩 문제

내가 가진 문제는 사용자가 "주문"목록에서 읽은 주문 목록을 가져 오는 것입니다. 이게 잘 작동 & DataGrid는 모든 주문을 보여줍니다 (합계 10 개 주문). 사용자는 버튼을 클릭하여 주문을 보냅니다. 그런 다음 응용 프로그램은 외부 응용 프로그램에서 대기하여 주문에 문제가 있는지 확인합니다.

한 주문에 문제가 있지만 다른 9 개가 내 목록에서 삭제되었다고 가정 해 보겠습니다. 내 DataGrid에서 10 개의 주문을 모두 표시하고 있습니까? OrderBlock에는 내 UI에서 업데이트하는 목록 이외의 다른 속성이 있는데 왜 목록이 아닌지 이해하지 못합니까?

내 코드를 단계별로 실행하고 내 목록의 설정자에 "OnPropertyChanged"를 입력하면 작동합니다.

또 다른 한가지 지적 할 점은 문제가 발생한 순서에는 null에서 "Some Error"로 변경되는 RejectReason이라는 속성이 있다는 것입니다. 혼란스러워.

편집 - 코드 OrderBlock 객체에

두 속성을 추가 - OrderCountSuccess 목록 디버깅하지 않는 한하지 않습니다 업데이트 않습니다. 주문이 내 목록에 읽은 다음 성공적으로 내 datagird에 표시되는 경우 주문

public OrderBlock OrderBlockEntity 
    { 
     get 
     { 
      return _orderBlockEntity; 
     } 
     set 
     { 
      _orderBlockEntity = value; 
      OnPropertyChanged("OrderBlockEntity"); 
     } 
    } 

이 방법은 목록이 포함되어 있습니다 (내보기 모델)

public int OrdersCountSuccess 
    { 
     get { return _ordersCountSuccess; } 
     set { _ordersCountSuccess = value; OnPropertyChanged("OrdersCountSuccess"); } 
    } 


public List<Order> Orders 
    { 
     get { return _orders; } 
     set { _orders = value; OnPropertyChanged("Orders"); } 
    } 

OrderBlock 객체

private void ImportRun() 
{ 
    OrderBlockEntity = Qoe.GetOrders(_fileLocation); 
} 

이 방법은 오류 정보가있는 주문이 다시 오는 곳입니다. & 목록이 변경되었지만 DataGrid가 업데이트되지 않습니다.

private void SendRun() 
    { 
     OrderBlockEntity = Qoe.SendOrders(OrderBlockEntity); 
    } 

대신 목록의 XAML

<!-- Grid that contains the DataGrid which shows the list of orders --> 
    <Grid Grid.Row="2" x:Name="GridOrders"> 
     <!-- The data grid to display orders--> 
     <DataGrid DataContext="{Binding OrderBlockEntity}" 
        x:Name="dataGridOrders" 
        ItemsSource="{Binding Orders}" 
        Style="{StaticResource DataGridTemplate}" 
        ColumnHeaderStyle="{StaticResource DG_ColumnHeader}"            
        RowStyle="{StaticResource DG_Row}" 
        CellStyle="{StaticResource DG_Cell}"          
        RowDetailsTemplate="{StaticResource DG_RowDetail}" 
        RowHeaderStyle="{StaticResource DG_RowHeader}" 
        AutoGenerateColumns="False" 
        HorizontalAlignment="Stretch" 
        VerticalAlignment="Stretch" 
        Background="Silver" 
        RowHeaderWidth="30"      
        Margin="25,5,20,15"            
        RowDetailsVisibilityChanged="dataGridOrders_RowDetailsVisibilityChanged">     
      <DataGrid.RowHeaderTemplate> 
       <DataTemplate> 
        <ToggleButton x:Name="RowHeaderToggleButton"           
            Click="RowHeaderToggleButton_Click" 
            Cursor="Hand"/> 
        <DataTemplate.Triggers> 
         <DataTrigger Binding="{Binding DataContext.MultiID, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type DataGridRow}}}" Value="False"> 
          <Setter TargetName="RowHeaderToggleButton" Property="Visibility" Value="Collapsed"/> 
         </DataTrigger> 
        </DataTemplate.Triggers> 
       </DataTemplate> 
      </DataGrid.RowHeaderTemplate> 
      <DataGrid.Columns> 
       <DataGridComboBoxColumn Header="Action"> 
        <DataGridComboBoxColumn.ElementStyle> 
         <Style TargetType="ComboBox"> 
          <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.StatusList}"/> 
          <Setter Property="IsReadOnly" Value="True"/> 
          <Setter Property="SelectedValue" Value="{Binding StatusGood}"/> 
          <Setter Property="Background" Value="Silver"/> 
         </Style> 
        </DataGridComboBoxColumn.ElementStyle> 
        <DataGridComboBoxColumn.EditingElementStyle> 
         <Style TargetType="ComboBox"> 
          <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, Path=DataContext.StatusList}"/> 
          <Setter Property="IsReadOnly" Value="True"/> 
          <Setter Property="SelectedValue" Value="{Binding StatusGood, UpdateSourceTrigger=PropertyChanged}"/> 
          <Setter Property="Background" Value="Silver"/> 
         </Style> 
        </DataGridComboBoxColumn.EditingElementStyle> 
       </DataGridComboBoxColumn> 
       <DataGridTextColumn Header="Fund" Binding="{Binding Account}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Security ID" Binding="{Binding Security.ID}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="ThinkFolio Security ID" Binding="{Binding Security.IDThinkFolio}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Security Name" Binding="{Binding Security.Name}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Buy/Sell" Binding="{Binding TransType}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Quantity" Binding="{Binding OrderQunatity, StringFormat=\{0:N0\}}" IsReadOnly="False"/> 
       <DataGridTextColumn Header="Currency" Binding="{Binding Security.Currency}" IsReadOnly="False"/> 
       <DataGridTextColumn Header="Manager" Binding="{Binding FundManager}" IsReadOnly="True"/> 
       <DataGridTextColumn Header="Dealing Desk" Binding="{Binding Dealer}" IsReadOnly="False"/> 
       <DataGridTextColumn Header="Order Reason" Binding="{Binding OrderReason}" IsReadOnly="False"/> 
       <DataGridTextColumn Binding="{Binding RejectReason}" IsReadOnly="True"> 
        <DataGridTextColumn.Header> 
         <TextBlock Text="{Binding DataContext.ColumnHeadInfo, RelativeSource={RelativeSource AncestorType={x:Type local:MainWindow}}}"/> 
        </DataGridTextColumn.Header> 
       </DataGridTextColumn> 
       <DataGridTextColumn Header="Comments" Binding="{Binding Comments}" IsReadOnly="False" Width="*"/> 
      </DataGrid.Columns> 
     </DataGrid>    
    </Grid> 
+0

지금까지 보았 듯이 INotifyCollectionChanged를 구현하지 않아서 OrderBlock이 실행되지 않습니다. OrderBlock은 Orders 컬렉션이므로 구현해야합니다. ObservableCollection을 사용하는 것이 더 나을 것이라고 생각합니다. @ user1729313 답변을 확인하십시오! :) – Eisenhorn

답변

2

사용 ObservableCollection에. 그것은 전체 ItemsSource를-설정을 다시 때문에

+0

... INotifyCollectionChanged를 구현하는 것을 잊지 말고 – Eisenhorn

+0

@Eisenhorn 어디서 INotifyCollectionChanged를 구현해야합니까? ObservableCollection은 INotifyCollectionChanged를 구현합니다. –

+0

@eranotzap : 물론 당신 말이 맞습니다. 컬렉션의 항목은 INotifyPropertyChanged를 구현해야합니다. – Eisenhorn

0

세터에서하여 PropertyChanged 이벤트가 작동하는 이유는, 그래서 당신이 그 문제를 접근 할 수있는 한 가지 방법이다가, 더 효과적인 방법은 ObservableCollection에를 사용하는 것입니다, 당신의 ItemsControl에는 수신 INotifyCollectionChanged.CollectionChanged 이벤트를 실행하고 각 항목에 대한 실제 UI 요소를 담당하는 ItemsContainerGenerator를 업데이트합니다.