दिलचस्प पोस्ट
हम एक स्थिर विधि में 'इस' कीवर्ड का उपयोग क्यों नहीं कर सकते? सी # में कन्स्ट्रक्टर का वापसी प्रकार क्या है? .NET में साझा मेमोरी कैसे कार्यान्वित करें? क्या इंटेलिएजे आईडीईए वेबस्टॉर्म और पीएचपीएसटॉम की सभी कार्यक्षमता प्लगइन्स के माध्यम से समाहित कर सकता है? एचटीएमएल टेबल हेडर हमेशा एक बड़े टेबल को देखते हुए खिड़की के शीर्ष पर दिखाई देते हैं मैं आधी रात को एनएसडीटी ऑब्जेक्ट कैसे सेट कर सकता हूं? कैसे इनपुट टैग से दो नंबरों को योग करने के लिए? जावा "बिट स्थानांतरण" ट्यूटोरियल? जावा कोड के लिए कमांड लाइन यूनिकोड तर्क पास करना दो सिंक्रनाइज़ किए गए तरीकों को एक साथ निष्पादित करें इसे बनाने के बाद एक मोंगोज़ में उप-दस्तावेज़ को कैसे पॉप्युलेट करना है? PHP के साथ ईमेल हैंडलिंग ईमेल पते की वैधता? LINQ अभिव्यक्ति में String.IsNullOrWhiteSpace क्लिक पर रेडियो बटन को चेक / अनचेक कैसे करें? सीमेक बूस्ट नहीं मिल रहा है

एक WPF DataGridComboBoxColumn MVVM के साथ बाध्यकारी

मैंने विभिन्न सवालों के जवाब देखे हैं, लेकिन समस्या को हल करने के लिए मैं कोशिश कर रहा हूं। मैंने इसे निम्न कोड (परिणाम के प्रतिनिधि को प्राप्त करने की कोशिश कर रहा हूँ) में कम कर दिया है, और मूल रूप से उस Person.TitleId को Person.TitleId करने के लिए सक्षम होना चाहता हूँ। Person.TitleId इसके संबंधित Title.TitleText रूप में। Title.TitleText जब पंक्ति संपादित नहीं की जा रही है, और ड्रॉप-डाउन सही तरीके से बाध्य है ताकि वह ड्रॉप-डाउन में TitleText प्रदर्शित कर TitleText और संबंधित TitleId को Person रिकॉर्ड पर वापस लिखता है, जब उसका बदला हो

संक्षेप में, मैं इसे प्राप्त करने के लिए अपने <DataGridComboBoxColumn> में क्या <DataGridComboBoxColumn> ?

App.xaml.cs

 protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var viewModel = new ViewModels.MainWindowViewModel(); var mainWindow = new MainWindow(); mainWindow.DataContext = viewModel; mainWindow.ShowDialog(); } 

MainWindow.xaml

 <Grid> <DataGrid AutoGenerateColumns="False" ItemsSource="{Binding Path=Contacts}"> <DataGrid.Columns> <DataGridComboBoxColumn Header="Title" SelectedItemBinding="{Binding Person}"> <DataGridComboBoxColumn.ElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Titles}"/> <Setter Property="IsReadOnly" Value="True"/> </Style> </DataGridComboBoxColumn.ElementStyle> <DataGridComboBoxColumn.EditingElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Titles}"/> <Setter Property="DisplayMemberPath" Value="TitleText" /> </Style> </DataGridComboBoxColumn.EditingElementStyle> </DataGridComboBoxColumn> </DataGrid.Columns> </DataGrid> </Grid> 

Person.cs

 public class Person { public int TitleId { get; set; } public string LastName { get; set; } public string FirstName { get; set; } } 

Title.cs

 public struct Title { public Title(int titleId, string titleText) : this() { TitleId = titleId; TitleText = titleText; } public string TitleText { get; private set; } public int TitleId { get; private set; } public static List<Title> GetAvailableTitles() { var titles = new List<Title>(); titles.Add(new Title(1, "Mr")); titles.Add(new Title(2, "Miss")); titles.Add(new Title(3, "Mrs")); return titles; } } 

MainWindowViewModel.cs

 public class MainWindowViewModel : ViewModelBase { private ObservableCollection<Person> contacts; private List<Title> titles; public MainWindowViewModel() { titles = Title.GetAvailableTitles(); Contacts = new ObservableCollection<Person>(); Contacts.Add(new Person() { FirstName = "Jane", LastName = "Smith", TitleId = 2 }); } public List<Title> Titles { get { return titles; } } public ObservableCollection<Person> Contacts { get { return contacts; } set { if (contacts != value) { contacts = value; this.OnPropertyChanged("Contacts"); } } } } 

ViewModelBase.cs

 public class ViewModelBase : INotifyPropertyChanged { protected void OnPropertyChanged(string propertyName) { if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } public event PropertyChangedEventHandler PropertyChanged; } 

Solutions Collecting From Web of "एक WPF DataGridComboBoxColumn MVVM के साथ बाध्यकारी"

यहां एक कामकाजी कोड है मुख्य बिंदु यहां SelecteItemBinding बजाय SelectedValueBinding का उपयोग करना था।

 <DataGridComboBoxColumn Header="Title" SelectedValueBinding="{Binding TitleId}" SelectedValuePath="TitleId" DisplayMemberPath="TitleText" > <DataGridComboBoxColumn.ElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Titles}"/> </Style> </DataGridComboBoxColumn.ElementStyle> <DataGridComboBoxColumn.EditingElementStyle> <Style TargetType="ComboBox"> <Setter Property="ItemsSource" Value="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}, Path=DataContext.Titles}"/> </Style> </DataGridComboBoxColumn.EditingElementStyle> </DataGridComboBoxColumn> 

@ स्नोबीयर के उत्तर ने मेरे लिए अच्छी तरह से काम किया लेकिन मैं बाध्यकारी के विवरण को स्पष्ट करना चाहता हूं।

@ रोब के उदाहरण में, शीर्षक और व्यक्ति वर्गों दोनों का उपयोग शीर्षकआईडीआईआईडी के लिए करते हैं। इसलिए, @ बर्फबीयर के उत्तर में, बाध्यकारी में:

 SelectedValueBinding="{Binding TitleId}" 

यह मेरे लिए तुरंत स्पष्ट नहीं था कि किस वर्ग और संपत्ति को बाध्य किया जा रहा था।

चूंकि SelectedValueBinding विशेषता DataGridComboBoxColumn पर प्रकट हुई थी, यह डेटाग्रिड युक्त ItemsSource के लिए बाध्य है। इस मामले में व्यक्ति वस्तुओं का संपर्क संग्रह

मेरे मामले में, डेटाग्रिड के डाटासोर्स संग्रह को एक संपत्ति के साथ श्रेय दिया गया था जिसे कॉम्बो बॉक्स के मदसामग्री संग्रह के मूल्यपैथ से अलग रखा गया था। तो मेरा चयनित वैल्यू बाइंडिंग का मान कॉम्बो बॉक्स के चुने हुए वैल्यूपथ नामक संपत्ति की तुलना में एक अलग संपत्ति के लिए बाध्य था।