2つの単純なModelクラスと1つの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のメインウィンドウに設定されています。
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
、DataGridGridItems
のをViewModelのコレクションに設定しました。この部分は機能し、名前が「Jim」の単一のグリッド線が表示されます。
ItemsSource
また、すべての行のComboBoxCompanyItems
のを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コレクションにバインドするにはどうすればよいですか?それは可能ですか?
よろしくお願いします!