i在基本数据杂志中保留当前警报和事件的列表,用户可以滚动列表。用户可以选择一个项目并确认该特定警报。这有效。 用户应该...

问题描述 投票:0回答:1
部分

<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>

ViewModel

部分 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); } }

也是,如果用户双击一个项目,我想运行单个确认命令。响应双击datagrid的“ MVVM”是什么?

要在a中观察当前可见的物品。我写了以下附件:

DataGrid

在XAML中,在您的定义中,您必须写下以下内容:

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

c# wpf mvvm datagrid observablecollection
1个回答
3
投票

DataGrid

每次您滚动时,Visiblesons都会更新。

在您的情况下,您必须更改附件列表中的列表类型以符合您的要求。

您可以使用

nameSpaceOfAttachedProperty:DataGridExtensions.ObserveVisiblePersons="True" nameSpaceOfAttachedProperty:DataGridExtensions.VisiblePersons="{Binding VisiblePersons, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
收集来过滤掉。
您还可以在MyDatagrid中应用过滤。但是不要显示过滤的项目。 
如何过滤datagrid


    

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.