2016-03-29 13 views
0

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); 
+0

「マスク」とはなんですか? –

+0

バインディングにトレースを追加し、VS出力ペインで何を取得するかを確認してください。 'System.Diagnostics.PresentationTraceSources.SetTraceLevel(selectedItemBinding、System.Diagnostics.PresentationTraceLevel.High);'私はXAMLでのみ使用しましたが、それは付属のプロパティなので、ちょうどそのように動作するはずです(彼は楽観的に言った)。 –

+0

"マスク"とはWPFウィンドウを意味します。ごめんなさい。 –

答えて

0

ではなくElementName

//selectedItemBinding.ElementName = "datagrid" 
selectedItemBinding.Source = datagrid; 
Sourceプロパティを使用してバインディングソースを設定してみてください

問題は、ElementNameアイテムがコードビハインドを介して実行時に動的に追加されるため、アイテムのルックアップが期待通りに機能しません。

関連する問題