WPF自定义控件,如何在ItemsControl DataTemplate中绑定按钮点击事件

3

我有一个自定义控件,继承自Textbox,在.cs文件中,我有一个名为SelectedItems的DependencyProperty(如果有任何项目,这些项目将显示在文本框内),如果没有,则文本框看起来像普通的文本框。

在generic.xaml中,在Template中添加了新的边框,并在其内部放置了ItemsControl,其中包含如下的项模板

XAML中的ItemControl部分:

<Border BorderBrush="Green" BorderThickness="1">
                        <ItemsControl x:Name="PART_SelectedItemsHost"
                                ItemsSource="{TemplateBinding SelectedItems}"
                                ItemTemplate="{TemplateBinding SelectedItemsTemplate}"
                                VerticalAlignment="Stretch"
                                HorizontalAlignment="Stretch"                                                                      
                                Margin="{TemplateBinding Padding}"
                                Visibility="Visible">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <WrapPanel IsItemsHost="True">
                                    </WrapPanel>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>                               
                        </ItemsControl>                            
                    </Border>

Xaml ItemTemplate 部分:

<DataTemplate x:Key="DefaultSelectedItemsTemplate" >
    <Border x:Name="selectedItemBorder" BorderBrush="Gray" BorderThickness="1" CornerRadius="5" Background="{DynamicResource {x:Static SystemColors.ControlBrushKey}}" Margin="5,1,1,1">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="15"/>
            </Grid.ColumnDefinitions>
            <TextBlock Grid.Column="0" Text="{Binding}" Margin="5,0,3,0"></TextBlock>
            <Button BorderThickness="0" Grid.Column="1" Click="???" or Command="???" >X</Button>
        </Grid>
    </Border>
</DataTemplate>

现在我该如何在我的.cs文件中绑定"X"按钮?我试着重写OnApplyTemplate()方法...我成功地绑定了当我点击项目文本框时的mousedown事件,但我不知道如何将click事件附加到按钮上。
            public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();
        ItemsControl itmControl = GetTemplateChild("PART_SelectedItemsHost") as ItemsControl;

        if (itmControl != null)
        {
            itmControl.MouseLeftButtonDown += new MouseButtonEventHandler(itmControl_MouseLeftButtonDown);

            // blind click on X buttons in ItemsControl
        }

    }

    private void itmControl_MouseLeftButtonDown(object obj, MouseButtonEventArgs e)
    {
        //IsMouseLeftButtonDown = true;
        System.Diagnostics.Debug.WriteLine(e.OriginalSource.ToString());
        object item = (e.OriginalSource as FrameworkElement).DataContext;
        deleteSelectedItem(item);

    }

这是控件的外观,需要点击 X 按钮从 SelectedItem 集合中删除该项。

图片


1
这个问题已经在这里重复并得到回答:http://stackoverflow.com/questions/29872080/wpf-customcontrol-binding-itemscontrol-datatemplate-button/29874527#29874527 如果您需要更多信息,请将您不知道的事情分开提问。 - Juan Pablo Garcia Coello
它还未被解答,而且我不知道该怎么移除旧的内容,因为我写得太差了,复杂难懂。 - Matija Gluhak
1个回答

1
ItemsControl的名称如下:
<ItemsControl x:Name="PART_SelectedItemsHost"

所以在模板中。
<Button  BorderThickness="0" Grid.Column="1" Command="{Binding DataContext.DeleteItem, ElementName=PART_SelectedItemsHost}" CommandParameter="{Binding}">X</Button>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接