6

これが私がやりたいことです。データベースからオブジェクトのリストを取得し、このリストをListBoxコントロールにバインドします。ListBoxItemsは、テキストボックスとボタンで構成されています。これが私が思いついたものです。この時点までは、意図したとおりに機能します。オブジェクトには、ID、名前などのいくつかのプロパティがあります。ListBoxItemのボタンをクリックすると、アイテムはListBoxとデータベースから消去されます...

<ListBox x:Name="taglistBox">    
                        <ListBox.ItemContainerStyle>
                            <Style TargetType="{x:Type ListBoxItem}">
                                <Setter Property="HorizontalAlignment" Value="Stretch"/>
                                <Setter Property="Template">
                                    <Setter.Value>
                                        <ControlTemplate TargetType="ListBoxItem">
                                            <ContentPresenter HorizontalAlignment="Stretch"/>
                                        </ControlTemplate>
                                    </Setter.Value>
                                </Setter>
                                <Setter Property="Tag" Value="{Binding TagSelf}"></Setter>
                            </Style>
                        </ListBox.ItemContainerStyle>
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <Grid HorizontalAlignment="Stretch">
                                    <Grid.ColumnDefinitions>
                                        <ColumnDefinition Width="Auto"/>
                                        <ColumnDefinition/>
                                    </Grid.ColumnDefinitions>
                                    <Button Grid.Column="0" Name="btTag"  VerticalAlignment="Center"  Click="btTag_Click" HorizontalAlignment="Left">
                                        <Image Width="16" Height="16" Source="/WpfApplication1;component/Resources/104.png"/>
                                    </Button>
                                    <TextBlock Name="tbtagBoxTagItem" Margin="5" Grid.Column="1" Text="{Binding Name}" VerticalAlignment="Center" />                                        
                                 </Grid>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                    </ListBox>

Textblock.Textはobject.Nameにバインドされ、ListBoxItem.Tagはobject.TagSelf(オブジェクト自体の単なるコピー)にバインドされます。

今私の質問

  1. listboxItemのボタンをクリックした場合、listboxitemとそれにバインドされているオブジェクトを元に戻すにはどうすればよいですか。データベースからオブジェクトを削除するには、なんらかの方法でオブジェクトを取得する必要があります。私は次のようなことを試みました

    ListBoxItem lbi1 =
    (ListBoxItem)(taglistBox.ItemContainerGenerator.ContainerFromItem(taglistBox.Items.CurrentItem)); ObjectInQuestion t =(ObjectInQuestion)lbi1.Tag;

  2. Itemssourceが変更された場合にListBoxの内容を自動的に更新する方法はありますか?今、私はそれを達成しています

    taglistBox.ItemsSource = null;
    taglistBox.ItemsSource = ObjectInQuestion;

私はあなたが与えることができるどんな助けにも感謝します:D事前に感謝します

4

3 に答える 3

39

各 ListBoxItem には、データ バインドされたコレクション内の対応する項目が DataContext として含まれます。また、ListBoxItem.ItemTemplate の各コントロールは DataContext を継承します。クリックされたボタンの背後にあるオブジェクトを取得するには、クリック イベント ハンドラーで次のようにします。

MyClass item = (MyClass)(sender as Button).DataContext;

データ ソースの変更をリスト ボックスに自動的に更新するには、ObservableCollection を使用できます。

于 2010-05-07T12:45:05.413 に答える
1

ObservableCollectionを使用して、即時の自動変更を確認します

DataContextを使用してSelectedItemを取得します

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    var btn = sender as Button; 
    myListBox.SelectedItem = btn.DataContext; 
}

ビューモデルには、リストボックスのselectedItemにバインドされたSelectedItemプロパティが必要です。その特定のアイテムをObservableCollectionから削除します。リストボックスには変更が反映されます。

于 2010-05-07T12:42:20.370 に答える
1

質問 2 へ: ObservableCollection を使用します。これは INotifyCollectionChanged を実装しているため、コレクションが変更されると項目が追加および削除されます。

質問 1 へ: 送信者をボタンとしてキャストし、その DataContext を使用します。これがバインドされたアイテムになります。ListBoxItem 自体も取得する必要がある場合はVisualTreeHelper.GetParent()、ツリーを検索できます。

于 2010-05-07T12:48:14.587 に答える