2011-01-13 11 views
1

私は非常に単純なものを実装しようとしていますが、私はWPFの最初のステップにあり、いくつか問題があります。私はVerticesと呼ばれるプロパティを持つComponentというクラスを持っています。 VerticesはPoint型の一般的なListです。私が望むのは、頂点プロパティをリストボックスにバインドすることです。これは、リストボックスの宣言に私のXAMLでこのコードを使用して簡単です:私は、リストボックスのためのDataTemplateを作成しようとするとリストボックスに汎用リストをバインドし、データテンプレートも使用します

ItemsSource="{Binding Path=Component.Vertices, Mode=OneWay, Converter={StaticResource verticesconverter},UpdateSourceTrigger=PropertyChanged}" 

トリッキーな部分があります。リストボックスの各行に、Vertex(Point.X、Point.Y)の値を持つテキストボックスとアイテムを削除するためのボタンが表示されます。データテンプレートの定義について教えてください。以下のコードは、X、Y値を2つの別々のテキストボックスにバインドするためには機能しません。間違いを教えてください。なぜテキストボックスに何も表示されないのですか?このような

<ListBox ItemsSource="{Binding Path=Component.Vertices, Mode=OneWay,UpdateSourceTrigger=PropertyChanged}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal" Margin="0,10,0,0"> 
      <TextBox Text="{Binding X}" MinWidth="35" MaxWidth="35"/> 
      <TextBox Text="{Binding Y}" MinWidth="35" MaxWidth="35"/> 
      </StackPanel> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
    /ListBox> 
+0

クラスとコレクションのコードビハインドを教えてください。おそらくそれが問題です。DataContextがある場合は、その場所を表示してください。 –

答えて

1

何か:

<ListBox ... Grid.IsSharedSizeScope="True"> 
    <ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
     <Grid.ColumnDefinitions> 
      <ColumnDefinition SharedSizeGroup="A"/> 
      <ColumnDefinition SharedSizeGroup="B"/> 
      <ColumnDefinition SharedSizeGroup="C"/> 
     </Grid.ColumnDefinitions> 
     <Grid.Children> 
      <TextBlock Grid.Column="0" Text="{Binding X}" Margin="5"/> 
      <TextBlock Grid.Column="1" Text="{Binding Y}" Margin="5"/> 
      <Button Grid.Column="2" Tag="{Binding}" Margin="5" Click="Button_Click" Content="Remove"/> 
     </Grid.Children> 
     </Grid> 
    </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

イベントハンドラ:

private void Button_Click(object sender, System.Windows.RoutedEventArgs e) 
{ 
    Button senderB = (Button)sender; 
    Point pt = (Point)senderB.Tag; 
    Collection.Remove(pt); 
} 

注:バインドされたコレクションがINotifyCollectionChanged(標準の実装を実現しない限り、GUIでのあなたのリストは更新されませなります使用できる:ObservableCollection<T>

編集:一般的なバインディングが失敗する原因: - >それは1つの
2.バインドパスは絶対的なものではなく作ると
から開始する一切のDataContextがない -
1.バウンドソースはパブリックプロパティではありません>自体にコンストラクタであなたの窓ののDataContextを設定します(this )や...
- あなたの財産は

EDIT2ここでそれがある場合>あなたのウィンドウの名前への結合でのElementNameを設定します。あなたのコレクションは頂点で構成されている場合は、あなたVertexクラスがでポイントが含まれている場合プロパティ名Pointあなたは{Binding Point.X}{Binding Point.Y}にバインディングを変更する必要があります。次回よりコードを投稿してください。

+0

私は上記の正確なコードを使用して何も表示しません。 ListBoxのItemSourceバインディングの前のコードを保持するか、そこに変更を加える必要がありますか? (あなたのコードをテストするためにコンバータを削除しました) – muku

+0

以前のバインディング(コレクションをバインドするだけで、コンバータは何をしますか?)を保持する必要があります。バインディングはPointのコレクションにまっすぐに移動し、DataContext DataTemplate内のポイントは{バインディングX}を介して座標のアクセスを可能にし、バインディングエラーをデバッグするために出力ウィンドウを確認します(VS2010の表示 - >出力) –

関連する問題