2011-10-25 16 views
1

2つのテキストボックスがあり、それぞれが異なるリストビューにあります。最初のテキストボックスは、XMLファイルからデータを表示することになっています。だから、テキストボックスをクリックすると、最初のテキストボックスのデータが2番目のテキストボックスに表示されます。私は非常に大きなラウンドを行い、特定のオブジェクトをクリックして別のリストビューに追加すると、これを行いました。 xamlの要素名でバインディングすることで、これを行う方法が短期間であるのでしょうか? textbox1のMy elementNameはtextbox2の名前になります。私はそれをやろうとしますが、私の道はどうあるべきかわかりません。2つのテキストボックスのデータバインド

私のxamlを含めないと申し訳ありません。

<Window x:Class="GridViewTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:diag="clr-namespace:System.Diagnostics;assembly=WindowsBase" 
    xmlns:local="clr-namespace:GridViewTest" 
    Title="MainWindow" mc:Ignorable="d" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" d:DesignHeight="541" d:DesignWidth="858" SizeToContent="WidthAndHeight"> 
<Window.Resources> 
    <local:PacketList x:Key="PacketList"/> 
    <local:BindableSelectionTextBox x:Key="BindableSelectionTextBox"/> 
</Window.Resources> 
<Grid Height="500" Width="798"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="142*" /> 
     <RowDefinition Height="145*" /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="234*" /> 
     <ColumnDefinition Width="233*" /> 
    </Grid.ColumnDefinitions> 
    <ListView ItemsSource="{Binding}" x:Name="lvItems" Grid.RowSpan="2" Grid.ColumnSpan="2"> 
     <ListView.View> 
      <GridView AllowsColumnReorder="True"> 
       <GridViewColumn Header="Header" Width="200"> 
        <GridViewColumn.CellTemplate> 
         <DataTemplate> 
          <Grid> 
           <TextBox Name ="A" Tag="Header" Text="{Binding SelectedText, Path=headerObj.headervalue}" PreviewMouseLeftButtonUp="Handle_Click" 
             IsReadOnly="True" BorderThickness="0" > 
           </TextBox> 
          </Grid> 
         </DataTemplate> 
        </GridViewColumn.CellTemplate> 
       </GridViewColumn> 
      </GridView> 
     </ListView.View> 
    </ListView> 
    <ListView Margin="0,245,0,8" Grid.ColumnSpan="2" Grid.RowSpan="2" > 
     <TextBox Name="headText" Text="{Binding SelectedText,ElementName=A}"/> 
    </ListView>  
</Grid> 

+0

同じコンテナ/ユーザーコントロール/ウィンドウに2つのテキストボックスがありますか? – benPearce

+0

はい、同じコンテナ/ユーザコントロール/ウィンドウにあります – edelweiss

+0

xamlを投稿できますか? – wdavo

答えて

1

まず、WPFのNameScopingについていくつかの教育を受けましょう。 WPFでは、Templates内のバインディングはすべてTemplateに限定されています。また、テンプレート内で名前が付けられた要素は、テンプレート外のBinding.ElementName参照では使用できません。テキストボックスAGridViewColumn.CellTemplate下の名前スコープであるよう

だからあなたのケースでのTextBox Aは、TextBoxのheadTextで参照することができません。

また、headTextのテキストボックスはListViewにありますか? ItemsControlsは、ListBox,ListView,DataGridのように単一の要素をホストするパネルまたはコンテナとして使用しないでください。彼らの意図は、複数のアイテムを表示することです。代わりにPanel秒またはContentControlを使用してください。 2つのテキストボックスの間で選択を同期させるために

<Grid Margin="0,245,0,8" Grid.ColumnSpan="2" Grid.RowSpan="2" > 
     <TextBox Name="headText" Text="{Binding SelectedText,ElementName=A}"/> 
    </Grid> 

OR

<ContentControl Margin="0,245,0,8" Grid.ColumnSpan="2" Grid.RowSpan="2" > 
     <TextBox Name="headText" Text="{Binding SelectedText,ElementName=A}"/> 
    </ContentControl> 

次のトリックを使用して...

XAML

<TextBox Name="SelectionSource" 
      Tag="{Binding ElementName=SelectionTarget}" 
      SelectionChanged="SelectionSource_SelectionChanged" /> 
    <TextBox Name="SelectionTarget" 
      Text="{Binding SelectedText, ElementName=SelectionSource, 
          Mode=TwoWay, UpdateSourceTrigger=Explicit}" /> 

背後にあるコード...

private void SelectionSource_SelectionChanged(object sender, RoutedEventArgs e) 
    { 
     var targetTextBox = ((TextBox) sender).Tag as TextBox; 
     if (targetTextBox != null) 
     { 
      var bndExp 
       = BindingOperations.GetBindingExpression(
        targetTextBox, TextBox.TextProperty); 

      if (bndExp != null) 
      { 
       bndExp.UpdateTarget(); 
      } 
     } 
    } 

あなたはMVVMは、その後、添付の行動にこのSelectionSource_SelectionChangedイベントを処理使用している場合。

EDIT 2:場合は今

1つのテキストボックスには、リストボックスのテンプレートの一部であり、他方は、テンプレートの外にある場合、コンテンツ制御ハックを使用して...

XAML:

の後ろ
<Window.Resources>  
    <TextBox x:Key="SelectionTarget" 
      Text="{Binding Tag.SelectedText, 
          RelativeSource={RelativeSource Self}, 
          Mode=TwoWay, 
          UpdateSourceTrigger=Explicit}" /> 
    </Window.Resources> 

    <StackPanel> 
    <ListBox> 
     <ListBox.ItemsSource> 
      <x:Array Type="{x:Type System:String}"> 
       <System:String>Test String 1</System:String> 
       <System:String>Test String 2</System:String> 
       <System:String>Test String 3</System:String> 
      </x:Array> 
     </ListBox.ItemsSource> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <TextBox Name="SelectionSource" 
         Text="{Binding Path=., Mode=TwoWay}" 
         Tag="{StaticResource SelectionTarget}" 
         SelectionChanged="SelectionSource_SelectionChanged" /> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

    <ContentControl Content="{StaticResource SelectionTarget}">   
    </ContentControl> 

</StackPanel> 

コード

private void SelectionSource_SelectionChanged( object sender, RoutedEventArgs e) { var targetTextBox = ((TextBox) sender).Tag as TextBox; if (targetTextBox != null) { targetTextBox.Tag = (TextBox) sender; var bndExp = BindingOperations.GetBindingExpression( targetTextBox, TextBox.TextProperty); if (bndExp != null) { bndExp.UpdateTarget(); } } } 

希望すると便利です。

+0

ohhhh私は2つのテンプレートの間の要素間の結合について知らなかった。非常に良い例です!本当にありがとう!!!!この場合、 – edelweiss

+0

は、テーブルのセルとそれ以外のテキストボックスのテキストボックスとしてテキストボックスのいずれかを実装する方法はありますか? – edelweiss

+0

私の見てください** **編集2 ** –

0

私は「SelectedText」あなたはにバインドしようとしていると何が起こっているのか本当にわからないんだけど、あなたがやろうとしているすべての中で「lvItems」のSelectedItemのテキストを表示された場合、あなたの " headText "次のテキストボックスが動作するはずです

<TextBox Name="headText" Text="{Binding ElementName=lvItems, Path=SelectedItem.headerObj.headervalue}" /> 

TextBox" A "バインディングも変更する必要があります。

<TextBox Name ="A" Tag="Header" Text="{Binding headerObj.headervalue}" IsReadOnly="True" BorderThickness="0" > 
</TextBox> 

headerObjは、パケットクラスのプロパティがあると仮定すると、およびheaderValueのは、その財産であり、headerValueのは、あなたがにバインドする値です。

TextBoxをクリックしたときではなく、SelectedItemが変更されたときに "headText"のテキストが更新されます。

関連する問題