WPF ItemsControl中DataTemplate内的Access按钮

时间:2017-01-21 07:31:57

标签: c# wpf datatemplate itemscontrol

我想访问MouseDown事件中的Button,我有以下内容:

XAML:

<ItemsControlx:Name="icName" MouseDown="icItems_MouseDown" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Button x:Name="btnName" Tag="{Binding ItemName}"</Button>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
 </ItemsControl>

C#:

private void icName_MouseDown(object sender, MouseButtonEventArgs e)
    {
       ???
    }

如何从ItemsControl MouseDown事件

访问该按钮
  

ex:MessageBox.Show(ItemName);

由于

3 个答案:

答案 0 :(得分:1)

请参阅以下示例代码。

connect(spinboxObject, QOverload<int>::of(&QSpinBox::valueChanged), this, [this](int newValue) { });
private void icName_MouseDown(object sender, MouseButtonEventArgs e)
{
    ContentPresenter cp = e.OriginalSource as ContentPresenter;
    if (cp != null && VisualTreeHelper.GetChildrenCount(cp) > 0)
    {
        Button button = VisualTreeHelper.GetChild(cp, 0) as Button;
        //do whatever you want with the Button here...
        if (button != null && button.Tag != null)
            MessageBox.Show(button.Tag.ToString());

    }
}

答案 1 :(得分:0)

如果您不需要访问按钮,而只需要绑定项目中的项目名称,那么我个人将在数据模板中添加处理程序,下面使用的是网格。

<ItemsControl x:Name="icName" >
        <ItemsControl.ItemTemplate>
            <DataTemplate>
                <Grid MouseDown="icItems_MouseDown" />
                    <Button x:Name="btnName" Tag="{Binding ItemName}"</Button>
                </Grid>
            </DataTemplate>
        </ItemsControl.ItemTemplate>
 </ItemsControl>

然后,您可以从处理程序中访问数据上下文。

    private void icName_MouseDown(object sender, MouseButtonEventArgs e)
    {
       var item = (YourItemType)((FrameworkElement)sender).DataContext;
       var itemName = item.ItemName;
    }

您也不需要标签

答案 2 :(得分:-1)

您无法处理一组按钮上的点击,并知道点击了哪一个按钮。您应该使用相同的处理程序处理每个按钮的单击:

<Button x:Name="btnName" Tag="{Binding ItemName}"  MouseDown="icItem_MouseDown"></Button>

然后sender是调用按钮:

private void icItem_MouseDown(object sender, MouseButtonEventArgs e)
{
   var btn = sender as Button;
   if(btn!=null)
       MessageBox.Show(btn.Tag);
}