WPFマスクデザイナのプロトタイプとしてコードビハインドによって作成されたWPFマスクを試しています。 私のViewModelに私はDataTableとDataView(これは単にDataTableのDefaultViewです)を持っています。 私のDataTableには、2つの列( "vorname"と "nachname")と4つの行があります。 私のWPFマスクでは、DataGridとDataGridのSelectedItemと列( "vorname"または "nachname")にバインドされた2つのTextBoxesが必要です。 実行時にDatGridの項目を選択すると、その項目のデータがTextBoxに表示されます。コードビハインドのSelectedItemにバインドされたテキストボックスは、DataGridが実現しません。
まず、XAMLファイルでDataGridを定義し、コード内にTextBoxesのバインディングを生成しようとしました。 ここでうまくいきます。 DataGridでアイテムを選択し、そのアイテムのデータがテキストボックスに表示されます。
しかし、コードでグリッドを生成するとき、それはもう動作しません。 NotifyOnSelectedIndexChangedのようなものがありますか?欠けていますか?
ご協力いただければ幸いです。
これはXAMLです:
<Window x:Class="DesignerTest.TestWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TestWindow"
Height="400"
Width="600">
<DockPanel x:Name="mainpanel">
<!--<DataGrid x:Name="datagrid"
DockPanel.Dock="Top"
Height="120" />-->
<WrapPanel x:Name="wrappanel">
<!--<TextBox x:Name="vornameSelected" Width="150" Margin="5" Text="{Binding SelectedItem.vorname, ElementName=datagrid}" IsEnabled="False" />
<TextBox x:Name="nachnameSelected" Width="150" Margin="5" Text="{Binding SelectedItem.nachname, ElementName=datagrid}" IsEnabled="False" />-->
<!--<TextBox x:Name="vornameSelected" Width="150" Margin="5" IsEnabled="False" />
<TextBox x:Name="nachnameSelected" Width="150" Margin="5" IsEnabled="False" />-->
</WrapPanel>
</DockPanel>
</Window>
そして、これは作成と結合のためのコードです:
// The ViewModel und the DataTable are created.
_vm = new SerializingTestViewModel();
_vm.CreateDataTable();
this.DataContext = _vm.DataTable;
// The DataGrid and it's Binding are created.
DataGrid datagrid = new DataGrid();
datagrid.Name = "datagrid";
DockPanel.SetDock(datagrid, Dock.Top);
datagrid.Height = 120;
datagrid.ItemsSource = _vm.DataSource;
mainpanel.Children.Add(datagrid);
// The Textboxes and the Bindings are created.
TextBox vornameSelected = new TextBox();
vornameSelected.Name = "vornameSelected";
vornameSelected.Width = 150;
Thickness margin = new Thickness(5);
vornameSelected.SetValue(TextBox.MarginProperty, margin);
vornameSelected.IsEnabled = false;
Binding selectedItemBinding = new Binding();
selectedItemBinding.ElementName = "datagrid";
selectedItemBinding.Path = new PropertyPath("SelectedItem.vorname");
vornameSelected.SetBinding(TextBox.TextProperty, selectedItemBinding);
wrappanel.Children.Add(vornameSelected);
TextBox nachnameSelected = new TextBox();
nachnameSelected.Name = "nachnameSelected";
nachnameSelected.Width = 150;
margin = new Thickness(5);
nachnameSelected.SetValue(TextBox.MarginProperty, margin);
nachnameSelected.IsEnabled = false;
selectedItemBinding = new Binding();
selectedItemBinding.ElementName = "datagrid";
selectedItemBinding.Path = new PropertyPath("SelectedItem.nachname");
nachnameSelected.SetBinding(TextBox.TextProperty, selectedItemBinding);
wrappanel.Children.Add(nachnameSelected);
「マスク」とはなんですか? –
バインディングにトレースを追加し、VS出力ペインで何を取得するかを確認してください。 'System.Diagnostics.PresentationTraceSources.SetTraceLevel(selectedItemBinding、System.Diagnostics.PresentationTraceLevel.High);'私はXAMLでのみ使用しましたが、それは付属のプロパティなので、ちょうどそのように動作するはずです(彼は楽観的に言った)。 –
"マスク"とはWPFウィンドウを意味します。ごめんなさい。 –