2015-12-23 26 views
0

我保存了基本數據網格中當前報警和事件的列表,用戶可以滾動瀏覽列表。用戶可以選擇一個項目並確認特定的警報。這工作。檢索數據網格中可見項目的列表

還應該大聲朗讀用戶以確認所有可見項目。這是我卡住的地方。 是否有可能從數據網格中檢索currentcollections列表? XAML

<Grid Background="DarkGray"> 
    <StackPanel Orientation="Horizontal"> 
     <StackPanel Orientation="Vertical"> 
      <Button Content="Ack visible" Command="{Binding AcknowledgeVisibleCommand}"/> 
      <Button Content="Ack selected" Command="{Binding AcknowledgeSelectedCommand}"/> 
     </StackPanel>  
     <DataGrid ItemsSource="{Binding AlarmAndEventList}" SelectedItem="{Binding SelectedAlarmItem}" Background="DarkGray" IsReadOnly="True"> 
     </DataGrid> 
    </StackPanel> 
</Grid> 

視圖模型

public ObservableCollection<AlarmItem> AlarmAndEventList { get { return _AlarmAndEventList; } } 

    private void AcknowledgeVisible() 
    { 
     //Do something with a list of visible items in datagrid 
    } 

    private void AcknowledgeSelected() 
    { 
     if (SelectedAlarmItem != null) 
     { 
      AlarmAndEventInstance.updateAlarmItem(SelectedAlarmItem); 
     } 


    } 

的部分

部分還有,我想運行,如果用戶雙擊一個項目單確認命令。響應雙擊數據網格的「MVVM方式」是什麼?

+0

你如何隱藏數據網格中的項目(或通過綁定收集)? – user1672994

+0

當你說'可見'項目時,你的意思是那些沒有被過濾出來的項目,或者你的意思是那些當前處於UI可見空間中的項目。第一個是當然在你自己的控制下,所以我假設你的意思是後者,但是想檢查... – LordWilmore

+0

是的我的意思是當前UI上可見的項目用戶必須滾動以查看更多項目。 – Snovva1

回答

1

觀察一個DataGrid我寫了下面的附加屬性當前可見的項目:

public class DataGridExtensions 
{ 
    public static readonly DependencyProperty ObserveVisiblePersonsProperty = DependencyProperty.RegisterAttached(
     "ObserveVisiblePersons", typeof(bool), typeof(DataGridExtensions), 
     new PropertyMetadata(false, OnObserveVisiblePersonsChanged)); 

    public static readonly DependencyProperty VisiblePersonsProperty = DependencyProperty.RegisterAttached(
     "VisiblePersons", typeof(List<Person>), typeof(DataGridExtensions), 
     new PropertyMetadata(null)); 

    private static readonly DependencyProperty SenderDataGridProperty = DependencyProperty.RegisterAttached(
     "SenderDataGrid", typeof(DataGrid), typeof(DataGridExtensions), new PropertyMetadata(default(DataGrid))); 

    private static void OnObserveVisiblePersonsChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     DataGrid dataGrid = d as DataGrid; 
     if (dataGrid == null) 
      return; 
     dataGrid.Loaded += DataGridLoaded; 
    } 

    private static void DataGridLoaded(object sender, RoutedEventArgs routedEventArgs) 
    { 
     DataGrid dataGrid = (DataGrid) sender; 
     dataGrid.Loaded -= DataGridLoaded; 
     ScrollViewer scrollViewer = FindChildren<ScrollViewer>(dataGrid).FirstOrDefault(); 
     if (scrollViewer != null) 
     { 
      SetSenderDataGrid(scrollViewer, dataGrid); 
      scrollViewer.ScrollChanged += ScrollViewerOnScrollChanged; 
     } 
    } 

    public static void SetObserveVisiblePersons(DependencyObject element, bool value) 
    { 
     element.SetValue(ObserveVisiblePersonsProperty, value); 
    } 

    public static bool GetObserveVisiblePersons(DependencyObject element) 
    { 
     return (bool) element.GetValue(ObserveVisiblePersonsProperty); 
    } 

    private static void SetSenderDataGrid(DependencyObject element, DataGrid value) 
    { 
     element.SetValue(SenderDataGridProperty, value); 
    } 

    private static DataGrid GetSenderDataGrid(DependencyObject element) 
    { 
     return (DataGrid) element.GetValue(SenderDataGridProperty); 
    } 

    private static void ScrollViewerOnScrollChanged(object sender, ScrollChangedEventArgs e) 
    { 
     ScrollViewer scrollViewer = sender as ScrollViewer; 
     if (scrollViewer == null) 
      return; 

     ScrollBar verticalScrollBar = 
      FindChildren<ScrollBar>(scrollViewer).FirstOrDefault(s => s.Orientation == Orientation.Vertical); 
     if (verticalScrollBar != null) 
     { 
      DataGrid dataGrid = GetSenderDataGrid(scrollViewer); 

      int totalCount = dataGrid.Items.Count; 
      int firstVisible = (int) verticalScrollBar.Value; 
      int lastVisible = (int) (firstVisible + totalCount - verticalScrollBar.Maximum); 

      List<Person> visiblePersons = new List<Person>(); 
      for (int i = firstVisible; i <= lastVisible; i++) 
      { 
       visiblePersons.Add((Person) dataGrid.Items[i]); 
      } 
      SetVisiblePersons(dataGrid, visiblePersons); 
     } 
    } 

    public static void SetVisiblePersons(DependencyObject element, List<Person> value) 
    { 
     element.SetValue(VisiblePersonsProperty, value); 
    } 

    public static List<Person> GetVisiblePersons(DependencyObject element) 
    { 
     return (List<Person>) element.GetValue(VisiblePersonsProperty); 
    } 

    private static IList<T> FindChildren<T>(DependencyObject element) where T : FrameworkElement 
    { 
     List<T> retval = new List<T>(); 
     for (int counter = 0; counter < VisualTreeHelper.GetChildrenCount(element); counter++) 
     { 
      FrameworkElement toadd = VisualTreeHelper.GetChild(element, counter) as FrameworkElement; 
      if (toadd != null) 
      { 
       T correctlyTyped = toadd as T; 
       if (correctlyTyped != null) 
       { 
        retval.Add(correctlyTyped); 
       } 
       else 
       { 
        retval.AddRange(FindChildren<T>(toadd)); 
       } 
      } 
     } 
     return retval; 
    } 
} 

,並在定義中的XAML來DataGrid你寫了以下內容:

nameSpaceOfAttachedProperty:DataGridExtensions.ObserveVisiblePersons="True" 
nameSpaceOfAttachedProperty:DataGridExtensions.VisiblePersons="{Binding VisiblePersons, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 

並在您的視圖模型,你將有喜歡它的屬性:

private List<Person> visiblePersons; 
public List<Person> VisiblePersons 
{ 
    get { return visiblePersons; } 
    set 
    { 
     visiblePersons = value; 
     OnPropertyChanged(); 
    } 
} 

而且每次滾動VisiblePersons都會更新。

在您的情況下,您必須更改附屬資產中的列表類型以符合您的要求。

+1

Tomtom這看起來很有前途,謝謝! – Snovva1

-1
  1. 您可以使用MyDataGrid.Items集合進行過濾。

  2. 您也可以在MyDataGrid中應用過濾。但不要顯示過濾的項目。 How to filter DataGrid

+0

我目前正在尋找一些東西來綁定到我的viewmodel中可以容納datagridview中當前可見項目的屬性。由於集合大於視圖,因此存在滾動條。假設集合中有20個項目,datagridview僅顯示其中4個項目,我想將屬性綁定到用戶當前顯示/可見的四個項目。 – Snovva1

+0

@ Snovva1休息16是存在,但需要滾動才能看? – AnjumSKhan