2011-02-03 11 views
3

私は、リストボックスと2つの別々のバインディングの問題があります。これは、texboxを含むitemtemplateです。リストボックス内のバインディングitemtemplateの問題

1)リストボックスは1つの文字列のリストにバインドします。作成されたテキストボックス内に各文字列を表示し、同時に双方向バインディングを許可するにはどうすればよいですか?パスまたはXPathを指定しないと、双方向バインディングは許可されません。

<ListBox Height="231" HorizontalAlignment="Left" Margin="0,167,0,0" Name="listBoxKeys" VerticalAlignment="Top" Width="219" ItemsSource="{Binding Path=SelectedPlatform.Keys}" SelectedItem="{Binding Path=SelectedKey,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
     <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal" Margin="0,0,0,0"> 
        <TextBox Text="{Binding Mode=OneWay}" Margin="0,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
</ListBox> 

そして2)私は、カスタムKeyValuePairクラスのいくつかの一般的なリストに結合する別のリストボックスを使用します。 itemtemplateには、テキストボックスとコンボボックスが含まれています。テキストボックステキストは、各KeyValuePairオブジェクトのkeyプロパティにバインドされ、combobox selecteditemはvalueプロパティにバインドされます。私の問題は、実行時に変更されるviewmodelで宣言された文字列のリストでコンボを埋めたいということです。ウィンドウのdatacontextは、リストが宣言されているビューモデルです。私はそこにコンボボックスのアイテムソースをバインドするために必要な正確な構文を知らない。ここに私のコードです:

<ListBox Height="393" HorizontalAlignment="Left" Margin="0,72,0,0" Name="listBoxActions" VerticalAlignment="Top" Width="254" ItemsSource="{Binding Path=SelectedPlayer.ControlProfile.MappedActions}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <StackPanel Orientation="Horizontal" Margin="0,0,0,0"> 
      <TextBox Text="{Binding Key, Mode=TwoWay,UpdateSourceTrigger=LostFocus}" Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
      <ComboBox Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center" ItemsSource="{Binding ?}" SelectedItem="{Binding Value, Mode=TwoWay}"/> 
     </StackPanel> 
     </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 
+1

あなたは二人が正解かもしれませんので、一部の人々は1とされていない他のに答えることができます見つけるつもりだとして、これは実際には2つの別々の質問されている必要があります。これにより、正しい答えとしてマークするのが難しくなります。 –

答えて

4

問題は、それがデータテンプレートが作成されたオブジェクト全体(文字列)は、ときに交換しなければならないことを意味するので、ソースに結合双方向自体が働くことができないということですユーザーはテキストボックス内のテキストを変更します。明らかに、これは動作しません。双方向バインディングは、バインドされたオブジェクトの書き込み可能なプロパティに対してのみ機能します。あなたのケースでは

私は、リストボックス内の項目(あなたの文字列の基本的にビューモデル)のためのビューモデルを作成し、データテンプレートでそれにそれにValueプロパティを公開してバインドすることをお勧め:

<ListBox Height="231" HorizontalAlignment="Left" Margin="0,167,0,0" 
     Name="listBoxKeys" VerticalAlignment="Top" Width="219" 
     ItemsSource="{Binding Path=SelectedPlatform.KeyViewModels}" 
     SelectedItem="{Binding Path=SelectedKey,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal" Margin="0,0,0,0"> 
        <TextBox Text="{Binding Value, Mode=TwoWay}" Margin="0,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
        </StackPanel> 
       </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 
+0

ありがとう。私は文字列プロパティNameを持つControllerKeyという無用なクラスを作成しました。ですから、私のSelectedPlatform.Keysは文字列ではなくControllerKey型の総称リストです。そのように私は私の問題を克服しました:) – muku

2

1)パブロGlazkovこれはコンボボックスは、現在のキーと値のペアではなくViewModelにあるためにダウンのDataContextにある)

2私には良い答えを持っているようです。これを行う他の方法があるかもしれませんが、前に使用した方法は、RelativeSourceソースのバインディングを親のItemsControlに戻すことです。

RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}} 

ような何か:

<ListBox Height="393" HorizontalAlignment="Left" Margin="0,72,0,0" Name="listBoxActions" VerticalAlignment="Top" Width="254" ItemsSource="{Binding Path=SelectedPlayer.ControlProfile.MappedActions}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
     <StackPanel Orientation="Horizontal" Margin="0,0,0,0"> 
      <TextBox Text="{Binding Key, Mode=TwoWay,UpdateSourceTrigger=LostFocus}" Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center"/> 
      <ComboBox Margin="10,0,0,0" Height="Auto" MinWidth="80" MaxWidth="80" HorizontalAlignment="Left" VerticalAlignment="Center" ItemsSource="{Binding DataContext.Keys, RelativeSource={RelativeSource AncestorType={x:Type ItemsControl}}}" SelectedItem="{Binding Value, Mode=TwoWay}"/> 
     </StackPanel> 
     </DataTemplate> 
     </ListBox.ItemTemplate> 
</ListBox> 
+0

あなたのコードはリストボックスの項目を探しています。しかし、それは私が必要なものではありません。リストボックスのItemsSourceがSelectedPlayer.ControlProfileにバインドされていることがわかったら... SelectedPlayerは私のviewmodelのプロパティです。ビューモデルにKeysという別のプロパティがあります。これでコンボボックスのItemsSourceをバインドしたいところです。 – muku

+0

@muku - 私の悪い...パズルの重要な部分を欠いていました。サンプルの最新のアップデートを確認してください。私はDataContext.Keysへのパスを変更しました –

+0

ちょっと感謝:)それは働いた。キーリストが更新された後、コンボボックスの項目を更新するために必要なことに関する良いチュートリアルを教えてください。より多くの事例を求めて困ってしまわないように、私は良いチュートリアルを見ることができます。 (私はwpfで初心者です) – muku

関連する問題