0

我在 WPF 中有一个数据模板,它附加到 ResultsViewModel 类并以表格格式呈现 VM。其中的一堆组成了 ListBox 中的 ListBoxItems。我想要的是在每个单独的表格中在边框的右上角有一个小 X,如果单击它,它会调用一个从列表框中删除该项目的函数。

我已经尝试使用超链接和事件 OnClick,但是我必须在主 XAML 中而不是在资源字典中拥有 DataTemplate,因为它需要 ax:Class 标记才能使用事件,但随后事件在 MainViewModel 中被触发,这是这不是世界上最糟糕的事情,因为可观察列表保存在 MainViewModel 中,并且无论如何都需要在那时删除,但我不知道如何获取对包含被点击的数据模板

<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

您可以通过两种方式实现此目的:

  1. 在您的父视图模型中创建一个类型的属性ResultsViewModel(包含您的ResultsViewModel对象集合)并将其绑定到SelectedItem您的ListBox. 向父视图模型添加某种类型RelayCommand以处理删除操作,添加 a并将其属性绑定Button到新命令。然后,当单击任何删除按钮时,您可以从您的集合中删除属性中找到的项目,并且 UI 应该相应地更新(假设您已经实现了接口)。DataTemplateCommandSelectedItemINotifyPropertyChange

  2. 您可以简单地从 中DataTemplate的每个项目直接绑定ListBox到父视图模型。这假定您Command在父视图模型中有一个名为Delete的父视图模型,并且父视图模型绑定到或出现的DataContext属性。还请注意将数据对象从集合中的每个项目传递给参数的重要部分在调用a 时。WindowUserControlListBoxCommandParameter="{Binding}"objectCommandCommand

例子:

<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 回答