두 개의 간단한 Model 클래스와 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은 DataContext
App.xaml.cs 의 MainWindow로 설정됩니다 .
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
DataGrid를 GridItems
ViewModel 컬렉션으로 설정 했습니다. 이 부분이 작동하면 이름이 "Jim"인 단일 그리드 선이 표시됩니다.
또한 ItemsSource
모든 행의 ComboBox를 CompanyItems
ViewModel 컬렉션 으로 설정하고 싶습니다 . 이 부분은 작동하지 않습니다. ComboBox가 비어 있고 디버거 출력 창에 오류 메시지가 표시됩니다.
System.Windows.Data 오류 : 2 : 대상 요소에 대한 관리 FrameworkElement 또는 FrameworkContentElement를 찾을 수 없습니다. BindingExpression : Path = CompanyItems; DataItem = null; 대상 요소는 'DataGridComboBoxColumn'(HashCode = 28633162)입니다. 대상 속성은 'ItemsSource'( 'IEnumerable'유형)입니다.
WPF 는 그렇지 않은 CompanyItems
속성이 될 것으로 예상 GridItem
하고 바인딩이 실패하는 이유입니다.
나는 이미 a 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 : 'RelativeSource FindAncestor, AncestorType ='System.Windows.Window ', AncestorLevel ='1 ''참조로 바인딩 할 소스를 찾을 수 없습니다. BindingExpression : Path = CompanyItems; DataItem = null; 대상 요소는 'DataGridComboBoxColumn'(HashCode = 1150788)입니다. 대상 속성은 'ItemsSource'( 'IEnumerable'유형)입니다.
질문 : DataGridComboBoxColumn의 ItemsSource를 ViewModel의 CompanyItems 컬렉션에 바인딩하려면 어떻게해야합니까? 전혀 가능합니까?
미리 도와 주셔서 감사합니다!