[解決済み] WPF DataGridのComboBoxColumnのItemsSourceのバインディング
質問
2つのシンプルなモデルクラスと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。
<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の
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
をデータグリッドの
GridItems
コレクションに追加します。この部分は動作し、Name "Jim"を持つ単一のGrid行が表示されます。
また
ItemsSource
を設定したい。
CompanyItems
コレクションに追加します。この部分はうまくいきません。ComboBox は空のままで、Debugger Output Window にエラー メッセージが表示されます。
System.Windows.Data Error: 2 : Cannot 管理された FrameworkElement または 要素のための FrameworkContentElement 要素が見つかりません。 BindingExpression:Path=CompanyItems; DataItem=null; ターゲットエレメントは 'DataGridComboBoxColumn' です。 (HashCode=28633162); ターゲットプロパティ は'ItemsSource'(タイプ'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 Error: 4 : できません 参照でバインディングのソースを見つけることができません。 'RelativeSource FindAncestor, AncestorType='System.Windows.Window', AncestorLevel='1''. BindingExpression:Path=CompanyItems; DataItem=null; ターゲットエレメントは 'DataGridComboBoxColumn'です。 (HashCode=1150788); ターゲットプロパティは 'ItemsSource' (タイプ 'IEnumerable') です。
質問です。DataGridComboBoxColumnのItemsSourceをViewModelのCompanyItemsコレクションにバインドするにはどうしたらよいですか?それはまったく可能ですか?
事前に助けをありがとうございました
どのように解決するのですか?
Plsは、以下のDataGridComboBoxColumn xamlがあなたのために動作するかどうかを確認してください。
<DataGridComboBoxColumn
SelectedValueBinding="{Binding CompanyID}"
DisplayMemberPath="Name"
SelectedValuePath="ID">
<DataGridComboBoxColumn.ElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.CompanyItems, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Style>
</DataGridComboBoxColumn.ElementStyle>
<DataGridComboBoxColumn.EditingElementStyle>
<Style TargetType="{x:Type ComboBox}">
<Setter Property="ItemsSource" Value="{Binding Path=DataContext.CompanyItems, RelativeSource={RelativeSource AncestorType={x:Type Window}}}" />
</Style>
</DataGridComboBoxColumn.EditingElementStyle>
</DataGridComboBoxColumn>
ここでは、あなたが直面している問題に対する別の解決策を見つけることができます。 WPFのDataGridでコンボボックスを使用する
関連
-
[解決済み】WCFとは何か、何ができるのか?
-
[解決済み] ServicePointManagerは、*スキームのプロキシをサポートしていません[closed]。
-
[解決済み] COMExceptionエラー80040154を修復する方法は?
-
[解決済み] Html.BeginForm()にCSSクラスを追加する。
-
[解決済み] NetFx45WebLinkとNetFx45RedistLinkの違いは何ですか?
-
[解決済み] .NET Framework 4 マルチターゲティングパックがアンインストールできない
-
[解決済み] .net の OOM 問題を解決する必要があります。
-
[解決済み] RelativeSourceでWPFバインディングを使用するにはどうしたらいいですか?
-
[解決済み] プライベートメソッドのユニットテストはどのように行うのですか?
-
[解決済み] HashSetとListの性能比較
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】プラットフォームが同じでも「不正なフォーマットでプログラムを読み込もうとしました。
-
[解決済み] EF Coreのadd-migrationのビルドに失敗しました。
-
[解決済み] SQL Server Compact EditionデータベースのLINQ to SQLで、"Row not found or changed "例外を解決するにはどうすればよいですか?
-
[解決済み] 24:00:00 を超える値を持つ .Net Timespan を格納するための正しい SQL タイプは何ですか?
-
[解決済み] 到達不能なホストに対してソケット操作を行おうとした
-
[解決済み] 1は有効なWin32アプリケーションではありません "を解決するには?
-
[解決済み] "SSL/TLSセキュアチャネルの信頼関係を当局と確立できませんでした "の解決方法
-
[解決済み] CryptographicException「キーセットが存在しない」、ただしWCF経由に限る
-
[解決済み] パッケージのダウングレード警告を検出(dotnet core, vs 2017)
-
[解決済み] HashSetとListの性能比較