0

ResultsViewModel クラスにアタッチされた WPF のデータ テンプレートがあり、VM をテーブル形式でレンダリングします。これらの束が ListBox の ListBoxItems を構成します。私が望むのは、個々のテーブルの境界線の右上に小さな X があることです。それをクリックすると、リストボックスからその項目を削除する関数が呼び出されます。

ハイパーリンクとイベント OnClick を試してみましたが、イベントを使用するには ax:Class タグが必要なため、リソース ディクショナリではなくメイン XAML に DataTemplate を配置する必要がありますが、MainViewModel でイベントが発生します。監視可能なリストは MainViewModel に保持されており、とにかくその時点で削除する必要があるため、世界で最悪のことではありませんが、含まれているリスト ボックス項目の ResultsViewModel への参照を取得する方法がわかりません。クリックされたデータ テンプレート

<DataTemplate x:Key="ErroredResultsTemplate" DataType="x:Type vm:ResultsViewModel" >
        <Border x:Name="Border" BorderBrush="{StaticResource ResultProcessedBorder}" Background="{StaticResource ResultFill}" BorderThickness="4" CornerRadius="10" Margin="6" Padding="5" Width="110" Height="110">
            <Grid>
                <Grid.RowDefinitions>
                    <RowDefinition Height="20" />
                    <RowDefinition Height="83" />
                </Grid.RowDefinitions>
                <TextBlock Grid.Row="0" Foreground="{StaticResource ResultGrayText}" FontWeight="Bold" HorizontalAlignment="Right" VerticalAlignment="Top">
                <Hyperlink Click="Close_Results">X</Hyperlink>
                </TextBlock>
                <TextBlock Width="90" Text="An error occurred calculating results" TextWrapping="Wrap" Foreground="{StaticResource ResultGrayText}" FontWeight="Bold" Grid.Row="1" HorizontalAlignment="Center" VerticalAlignment="Top" TextAlignment="Center" />
            </Grid>
        </Border>
    </DataTemplate>
4

1 に答える 1

1

You can achieve this in two ways:

  1. Create a property of type ResultsViewModel in your parent view model (that contains your collection of ResultsViewModel objects) and bind that to the SelectedItem property of your ListBox. Add some kind of RelayCommand to the parent view model to handle the delete action, add a Button to your DataTemplate and bind its Command property to the new command. Then, when any delete button is clicked, you can just remove the item found in the SelectedItem property from your collection and the UI should update accordingly (assuming that you've implemented the INotifyPropertyChange interface).

  2. You can simply bind from the DataTemplate of each item in the ListBox to the parent view model directly. This assumes that you have a Command in your parent view model named Delete and that the parent view model is bound to the DataContext property of the Window or UserControl that the ListBox appears in. Also note the important CommandParameter="{Binding}" part which passes the data object from each item in the collection to the object parameter in the Command when a Command is called.

Example:

<Button Content="X" Command="{Binding DataContext.Delete, 
    RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type 
    XmlNameSpace:WindowOrUserControlName}}, Mode=OneWay}" 
    CommandParameter="{Binding}" />
于 2013-07-22T10:57:32.977 に答える