【问题标题】:Access Button inside DataTemplate in WPF ItemsControlWPF ItemsControl中DataTemplate内的访问按钮
【发布时间】:2017-01-21 07:31:56
【问题描述】:

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

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 事件中访问按钮

例如:MessageBox.Show(ItemName);

谢谢

【问题讨论】:

  • 按钮处于禁用模式
  • @AbdulsalamElsharif 请解释您在这里实际想要实现的目标。为什么要访问 Button?
  • 关于您的禁用按钮,您应该按照我在其他问题中的建议进行操作。没办法 :) 你也可以将我的其他答案标记为正确
  • @Clemens 我有 ItemsControl 将项目显示为按钮,某些按钮可能显示为禁用项目,我想通过单击并按住此禁用按钮来访问此按钮,但我无法访问在禁用模式下按钮事件。所以我正在尝试使用按钮父级来获取它,这就是我想要完成的......希望这清楚
  • @Emad 关于禁用按钮我找到了正确的解决方案,因为我在那个问题中提到了你。我不需要任何文本框。

标签: c# wpf datatemplate itemscontrol


【解决方案1】:

请参考以下示例代码。

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());

    }
}

<ItemsControl x:Name="icName" MouseDown="icName_MouseDown" >
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Button x:Name="btnName" Content="Button" IsEnabled="False" Tag="{Binding ItemName}"></Button>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

【讨论】:

    【解决方案2】:

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

    <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;
        }
    

    你也根本不需要标签

    【讨论】:

      【解决方案3】:

      您无法处理对一组按钮的点击并知道点击了哪个按钮。您应该使用相同的处理程序来处理每个按钮的点击,如下所示:

      <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);
      }
      

      【讨论】:

      • 再一次,按钮处于禁用模式
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-13
      相关资源
      最近更新 更多