मेरे पास दो सरल मॉडल कक्षाएं और एक ViewModel है ...
public class GridItem
{
public string Name { get; set; }
public int CompanyID { get; set; }
}
public class CompanyItem
{
public int ID { get; set; }
public string Name { get; set; }
}
public class ViewModel
{
public ViewModel()
{
GridItems = new ObservableCollection<GridItem>() {
new GridItem() { Name = "Jim", CompanyID = 1 } };
CompanyItems = new ObservableCollection<CompanyItem>() {
new CompanyItem() { ID = 1, Name = "Company 1" },
new CompanyItem() { ID = 2, Name = "Company 2" } };
}
public ObservableCollection<GridItem> GridItems { get; set; }
public ObservableCollection<CompanyItem> CompanyItems { get; set; }
}
... और एक साधारण खिड़की:
<Window x:Class="DataGridComboBoxColumnApp.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 AutoGenerateColumns="False" ItemsSource="{Binding GridItems}" >
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Name}" />
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
</DataGrid.Columns>
</DataGrid>
</Grid>
</Window>
ViewModel को MainWindow के DataContextApp.xaml.cs में सेट किया गया है :
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
MainWindow window = new MainWindow();
ViewModel viewModel = new ViewModel();
window.DataContext = viewModel;
window.Show();
}
}
जैसा कि आप देख सकते हैं मैं ItemsSourceडेटाग्रिड को डेटा सेट पर भेज सकता हूंGridItems ViewModel संग्रह में । यह हिस्सा काम करता है, नाम "जिम" के साथ एकल ग्रिड लाइन प्रदर्शित की जाती है।
मैं भी ViewModel ItemsSourceके CompanyItemsसंग्रह के लिए हर पंक्ति में कॉम्बो बॉक्स सेट करना चाहता हूं । यह हिस्सा काम नहीं करता है: कॉम्बोबॉक्स खाली रहता है और डीबगर आउटपुट विंडो में मुझे एक त्रुटि संदेश दिखाई देता है:
System.Windows.Data Error: 2: टारगेट एलिमेंट के लिए गवर्निंग फ्रेमवर्क या फ्रेमवर्ककंटेनमेंट नहीं पा सकते हैं। बाइंडिंग एक्सप्रेशन: पाथ = कंपनीइम्स; DataItem = null; लक्ष्य तत्व 'डेटाग्रिडबॉम्ब बॉक्स-कॉलम' (हैशकोड = 28633162) है; टारगेट प्रॉपर्टी है 'आइटम्स सोर्स' (टाइप करें 'IEnumerable')
मेरा मानना है कि WPF की CompanyItemsएक संपत्ति होने की उम्मीद हैGridItem मामला नहीं है, और यही कारण है कि बाध्यकारी विफल हो जाता है।
मैं पहले से ही एक के साथ काम करने की कोशिश की है RelativeSourceऔर AncestorTypeऐसा है:
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
लेकिन यह मुझे डिबगर आउटपुट में एक और त्रुटि देता है:
System.Windows.Data त्रुटि: 4: संदर्भ के साथ बाइंडिंग के लिए स्रोत नहीं ढूँढ सकता बाइंडिंग एक्सप्रेशन: पाथ = कंपनीइम्स; DataItem = null; लक्ष्य तत्व 'DataGridComboBoxColumn' (HashCode = 1150788) है; टारगेट प्रॉपर्टी है 'आइटम्स सोर्स' (टाइप करें 'IEnumerable')
प्रश्न: मैं DataMridComboBoxColumn के आइटम्स को कंपनी के साथ कैसे जोड़ सकता हूं, यह ViewModel के संग्रह के लिए है? क्या यह सभी के लिए संभव है?
अग्रिम में मदद के लिए धन्यवाद!