Tôi có hai lớp Model đơn giản và 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; }
}
... và một Cửa sổ đơn giản:
<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 được đặt thành MainWindow DataContext
trong App.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();
}
}
Như bạn có thể thấy, tôi đặt ItemsSource
DataGrid thành GridItems
bộ sưu tập của ViewModel. Phần này hoạt động, dòng Grid duy nhất có Tên "Jim" được hiển thị.
Tôi cũng muốn đặt ItemsSource
ComboBox ở mọi hàng thành CompanyItems
bộ sưu tập của ViewModel. Phần này không hoạt động: ComboBox vẫn trống và trong Cửa sổ đầu ra của trình gỡ lỗi, tôi thấy thông báo lỗi:
Lỗi System.Windows.Data: 2: Không thể tìm thấy FrameworkElement quản lý hoặc FrameworkContentElement cho phần tử đích. BindingExpression: Path = CompanyItems; DataItem = null; phần tử đích là 'DataGridComboBoxColumn' (HashCode = 28633162); thuộc tính mục tiêu là 'ItemsSource' (nhập 'IEnumerable')
Tôi tin rằng WPF mong đợi CompanyItems
là một tài sản GridItem
không phải như vậy và đó là lý do tại sao ràng buộc không thành công.
Tôi đã cố gắng làm việc với một RelativeSource
và AncestorType
như vậy:
<DataGridComboBoxColumn ItemsSource="{Binding CompanyItems,
RelativeSource={RelativeSource Mode=FindAncestor,
AncestorType={x:Type Window}}}"
DisplayMemberPath="Name"
SelectedValuePath="ID"
SelectedValueBinding="{Binding CompanyID}" />
Nhưng điều đó mang lại cho tôi một lỗi khác trong đầu ra của trình gỡ lỗi:
Lỗi System.Windows.Data: 4: Không thể tìm thấy nguồn để liên kết với tham chiếu 'RelativeSource FindAncestor, AncestorType =' System.Windows.Window ', AncestorLevel =' 1 ''. BindingExpression: Path = CompanyItems; DataItem = null; phần tử đích là 'DataGridComboBoxColumn' (HashCode = 1150788); thuộc tính mục tiêu là 'ItemsSource' (nhập 'IEnumerable')
Câu hỏi: Tôi làm cách nào để liên kết Nguồn mục của DataGridComboBoxColumn với bộ sưu tập CompanyItems của ViewModel? Có thể ở tất cả?
Cảm ơn bạn đã giúp đỡ trước!