दिलचस्प पोस्ट
क्या यह गतिशील रूप से संकलन और सी # कोड टुकड़े निष्पादित करने के लिए संभव है? आईओएस 7+ में बेस64 डिकोडिंग एनपीएम काम नहीं कर रहा है – "ईनोनसेसेट पढ़ें" आईओएस 6.0 देशी फेसबुक एकीकरण के साथ साझा करना: "मेरे ऐप नाम के माध्यम से पोस्ट किया गया"? Symfony2 – एसेटिक – सीएसएस में लोड चित्र PerformSelector का उपयोग कैसे करें: withObject: afterDelay: कोको में प्राचीन प्रकारों के साथ? पृष्ठों के बीच एक वेबसॉकेट कनेक्शन को कैसे बनाए रखा जाए? HttpUrlConnection के शीर्षलेख को कैसे संशोधित करें ASP.NET वेब एपीआई यूआरएल कैसे बनाएं? कर्ल त्रुटि 60, SSL प्रमाणपत्र जारी: प्रमाण पत्र श्रृंखला में स्वयं हस्ताक्षरित प्रमाणपत्र 2 फ़ील्ड का उपयोग करने वाली कांगो कस्टम सत्यापन ढूँढें: -exec को लापता तर्क पायथन स्ट्रॉटाइम – 0 की अग्रणी बिना तारीख? खिड़की के साथ पोस्ट डेटा पास करें। location.href गोलांग संरचना समारोह को आह्वान करता है "बिना असमर्थित क्षेत्र या विधि का उल्लेख नहीं कर सकता"

एक MVVM WPF प्रोजेक्ट में एक डेटाग्रिड से एकाधिक आइटम चुनें

मैं एक MVVM WPF प्रोजेक्ट में एक डाटाग्रीड से एकाधिक आइटम कैसे चुन सकता हूं?

Solutions Collecting From Web of "एक MVVM WPF प्रोजेक्ट में एक डेटाग्रिड से एकाधिक आइटम चुनें"

आप ऐसा करने के लिए बस एक कस्टम निर्भरता संपत्ति जोड़ सकते हैं :

 public class CustomDataGrid : DataGrid { public CustomDataGrid () { this.SelectionChanged += CustomDataGrid_SelectionChanged; } void CustomDataGrid_SelectionChanged (object sender, SelectionChangedEventArgs e) { this.SelectedItemsList = this.SelectedItems; } #region SelectedItemsList public IList SelectedItemsList { get { return (IList)GetValue (SelectedItemsListProperty); } set { SetValue (SelectedItemsListProperty, value); } } public static readonly DependencyProperty SelectedItemsListProperty = DependencyProperty.Register ("SelectedItemsList", typeof (IList), typeof (CustomDataGrid), new PropertyMetadata (null)); #endregion } 

अब आप XAML में इस dataGrid उपयोग कर सकते हैं:

 <Window x:Class="DataGridTesting.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" xmlns:local="clr-namespace:DataGridTesting.CustomDatagrid" Title="MainWindow" Height="350" Width="525"> <DockPanel> <local:CustomDataGrid ItemsSource="{Binding Model}" SelectionMode="Extended" AlternatingRowBackground="Aquamarine" SelectionUnit="FullRow" IsReadOnly="True" SnapsToDevicePixels="True" SelectedItemsList="{Binding TestSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/> </DockPanel> </Window> 

मेरा ViewModel :

 public class MyViewModel : INotifyPropertyChanged { private static object _lock = new object (); private List<MyModel> _myModel; public IEnumerable<MyModel> Model { get { return _myModel; } } private IList _selectedModels = new ArrayList (); public IList TestSelected { get { return _selectedModels; } set { _selectedModels = value; RaisePropertyChanged ("TestSelected"); } } public MyViewModel () { _myModel = new List<MyModel> (); BindingOperations.EnableCollectionSynchronization (_myModel, _lock); for (int i = 0; i < 10; i++) { _myModel.Add (new MyModel { Name = "Test " + i, Age = i * 22 }); } RaisePropertyChanged ("Model"); } public event PropertyChangedEventHandler PropertyChanged; public void RaisePropertyChanged (string propertyName) { var pc = PropertyChanged; if (pc != null) pc (this, new PropertyChangedEventArgs (propertyName)); } } 

मेरा मॉडल:

 public class MyModel { public string Name { get; set; } public int Age { get; set; } } 

और अंत में, यहां मुख्य MainWindow के पीछे कोड है:

 public partial class MainWindow : Window { public MainWindow () { InitializeComponent (); this.DataContext = new MyViewModel (); } } 

मुझे उम्मीद है कि यह साफ MVVM डिज़ाइन मदद करता है

मैं क्या करूँगा System.Windows.Interactivity का उपयोग कर Behaviors System.Windows.Interactivity । आपको अपनी परियोजना में इसे मैन्युअल रूप से संदर्भ देना होगा।

एक नियंत्रण को देखते हुए SelectedItems ईटम्स जैसे, (लिस्टबॉक्स, डेटाग्रिड) को प्रदर्शित नहीं किया जाता है

आप इस तरह से एक व्यवहार वर्ग बना सकते हैं

 public class ListBoxSelectedItemsBehavior : Behavior<ListBox> { protected override void OnAttached() { AssociatedObject.SelectionChanged += AssociatedObjectSelectionChanged; } protected override void OnDetaching() { AssociatedObject.SelectionChanged -= AssociatedObjectSelectionChanged; } void AssociatedObjectSelectionChanged(object sender, SelectionChangedEventArgs e) { var array = new object[AssociatedObject.SelectedItems.Count]; AssociatedObject.SelectedItems.CopyTo(array, 0); SelectedItems = array; } public static readonly DependencyProperty SelectedItemsProperty = DependencyProperty.Register("SelectedItems", typeof(IEnumerable), typeof(ListBoxSelectedItemsBehavior), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)); public IEnumerable SelectedItems { get { return (IEnumerable)GetValue(SelectedItemsProperty); } set { SetValue(SelectedItemsProperty, value); } } } 

और अपने XAML मैं इस तरह Binding करूँगा जहां i xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" और behaviors आपके Behavior वर्ग के नाम स्थान है

 <ListBox> <i:Interaction.Behaviors> <behaviors:ListBoxSelectedItemsBehavior SelectedItems="{Binding SelectedItems, Mode=OneWayToSource}" /> </i:Interaction.Behaviors> 

मान लें कि ListBox लिए आपके DataContext में ViewModel में SelectedItems संपत्ति है, तो यह स्वचालित रूप से SelectedItems अद्यतन करेगा। आपने View यानी से सदस्यता लेने वाली event को समझाया है,

 <ListBox SelectionChanged="ListBox_SelectionChanged"/> 

यदि आप चाहते हैं तो आप Behavior वर्ग को Behavior परिवर्तित कर सकते हैं।

मैं अपने समाधान में इस समाधान का उपयोग करता हूं:

XAML:

 <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged"> <i:InvokeCommandAction Command="{Binding SelectItemsCommand}" CommandParameter="{Binding Path=SelectedItems,ElementName=TestListView}"/> </i:EventTrigger> </i:Interaction.Triggers> 

आप के शीर्ष पर xaml फ़ाइल, कोड की इस पंक्ति को जोड़ें:

 xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 

SelectedItemsCommand ICommand प्रकार है जो आपके व्यू-मॉडल में लिखा गया है।

DLL उपयोग:

System.Windows.Interactivity.dll

WPF की डिफ़ॉल्ट डाटाग्रिड के साथ यह बाध्यकारी का उपयोग करना संभव नहीं है, चूंकि यह SelectedItem -Property के साथ संभव है, चूंकि SelectedItems -Property DependencyProperty नहीं है

आप जो चाहते हैं, उनके लिए एक तरीका है कि आप अपने ViewModel की संपत्ति को अपडेट करने के लिए डेटाग्रिड के SelectionChanged चेंग-एवेंट को पंजीकृत करना है, जो चयनित आइटम्स को स्टोर करता है।

चयनित संपत्ति DataGrid के प्रकार IList प्रकार है, इसलिए आपको अपने विशिष्ट प्रकार के लिए सूची में आइटम डालने की आवश्यकता है।

सी#

 public MyViewModel { get{ return this.DataContext as MyViewModel; } } private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e) { // ... Get SelectedItems from DataGrid. var grid = sender as DataGrid; var selected = grid.SelectedItems; List<MyObject> selectedObjects = selected.OfType<MyObject>().ToList(); MyViewModel.SelectedMyObjects = selectedObjects; } 

XAML

 <Window x:Class="WpfApplication1.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="MainWindow" Height="350" Width="525"> <Grid> <DataGrid SelectionChanged="DataGrid_SelectionChanged" /> </Grid> </Window> 

आप एक पुन: प्रयोज्य सामान्य आधार वर्ग बना सकते हैं। इस तरह से आप कोड और UI दोनों से पंक्तियों का चयन कर सकते हैं

यह मेरा उदाहरण वर्ग है जिसे मैं चयन करना चाहता हूं

 public class MyClass { public string MyString {get; set;} } 

चयन वर्गों के लिए जेनेरिक बेस क्लास बनाएं INotifyPropertyChanged UI सेट बनाता है जब आप IsSelected सेट करते हैं

 public class SelectableItem<T> : System.ComponentModel.INotifyPropertyChanged { public SelectableItem(T item) { Item = item; } public T Item { get; set; } bool _isSelected; public bool IsSelected { get { return _isSelected; } set { if (value == _isSelected) { return; } _isSelected = value; if (PropertyChanged != null) { PropertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs("IsSelected")); } } } public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged; } 

चयन वर्ग बनाएँ

 public class MySelectableItem: SelectableItem<MyClass> { public MySelectableItem(MyClass item) :base(item) { } } 

बाइंड करने के लिए संपत्ति बनाएं

 ObservableCollection<MySelectableItem> MyObservableCollection ... 

प्रेट्टी सेट करें

 MyObservableCollection = myItems.Select(x => new MySelectableItem(x)); 

डेटाग्रिड से बाइंड करें और डेटा ग्रिड आरओ पर एक शैली जोड़ें जो कि आईएसएक्लेटेड प्रोटीटी से माइस्लेटेड इटैम पर बांधता है

 <DataGrid ItemsSource="{Binding MyObservableCollection}" SelectionMode="Extended"> <DataGrid.Resources> <Style TargetType="DataGridRow"> <Setter Property="IsSelected" Value="{Binding IsSelected}" /> </Style> </DataGrid.Resources> </DataGrid> 

चयनित पंक्तियां / आइटम प्राप्त करने के लिए

 var selectedItems = MyObservableCollection.Where(x=>x.IsSelected).Select(y=>y.Item); 

पंक्तियों / मदों का चयन करने के लिए

 MyObservableCollection[0].IsSelected = true; 

आप मॉडल में "IsSelected" प्रॉपर्टी जोड़ सकते हैं और पंक्ति में एक चेकबॉक्स जोड़ सकते हैं

WPF DataGrid इस के लिए अनुमति देता है बस सेट करेंडेटाग्रिड.राव। सेलेक्शनमॉड और डेटाग्रिड.रो। क्रमशः "विस्तारित" और "सेलऑररोहेडर" के लिए चयन करें। यह ब्लेंड में किया जा सकता है, जैसा मैंने उस छवि में दिखाया है जो मैंने शामिल किया है। इससे उपयोगकर्ता को प्रत्येक सेल, संपूर्ण पंक्ति आदि का चयन करने की अनुमति होगी, जितनी उन्हें पसंद है, या तो शिफ्ट या Ctrl कुंजी का चयन करके चयन जारी रखने के लिए। यहां छवि विवरण दर्ज करें