【问题标题】:How to catch expander header button click event如何捕获扩展标题按钮单击事件
【发布时间】:2019-12-16 12:24:11
【问题描述】:

我在扩展器标题上有一个带有按钮的扩展器。我想知道在哪个扩展器标题上单击了按钮,因为我应该修改 button_click 事件的数据。如果我没有将它与视图模型绑定

<Expander IsExpanded="True">
    <Expander.Header>
        <StackPanel Orientation="Horizontal">
            <Button Name="btnAllDone" Click="btnAllDone_Click  >Close
            </Button>
        </StackPanel>
    </Expander.Header>
    <Expander.Content>
        <ItemsPresenter/>
    </Expander.Content>
</Expander>

这是点击事件

private void btnAllDone_Click(object sender, RoutedEventArgs e)
{
    MessageBoxResult result = MessageBox.Show("Are you sure?", "All", MessageBoxButton.YesNo);
    switch (result)
    {
        case MessageBoxResult.Yes:
            try
            {

            //AND HERE I WANT TO MODIFY THE DATA(MYOBJECT) OF THE CURRENT EXPANDER HEADER GROUP
            }
            catch (Exception ex)
            {

                throw;
            }
            break;
        case MessageBoxResult.No:
            break;
    }
}

【问题讨论】:

    标签: c# wpf button expander


    【解决方案1】:

    看起来像扩展器、按钮和事件处理程序是一一对应的。所以将 Name 分配给扩展器,并在事件处理程序中使用它:

    <Expander x:Name="expanderAllDone" IsExpanded="True">
        <Expander.Header>
            <StackPanel Orientation="Horizontal">
                <Button Name="btnAllDone" Content="Close" Click="btnAllDone_Click"/>
            </StackPanel>
        </Expander.Header>
        <Expander.Content>
            <ItemsPresenter/>
        </Expander.Content>
    </Expander>
    
    private void btnAllDone_Click(object sender, RoutedEventArgs e)
    {
        MessageBoxResult result = MessageBox.Show("Are you sure?", "All", MessageBoxButton.YesNo);
        if (result != MessageBoxResult.Yes) 
            return;
    
        try
        {
            expanderAllDone.IsExpanded = false;
        }
        catch (Exception ex)
        {
            throw;
        }
    }
    

    【讨论】:

    • 我添加了 Name 属性,当我从 cs 调用它时,它显示当前上下文中不存在名称。我想获取该扩展器的值并添加到 myobject。
    • 您是否在 xaml 中有某种模板?
    【解决方案2】:

    你可以添加 Expander 的 name 属性,这样你就可以检查生成了哪个扩展器事件

    【讨论】:

    • 我编辑了问题,然后如何从点击事件中调用它?谢谢你的时间
    • 如果我理解正确,您可以将 sender 转换为 Button 类。它将是 'Button expander = (Button) sender' 然后您可以检查 expander.Name 属性是否将其提供给您的扩展器
    【解决方案3】:

    试试这个:

    private static T GetParent<T>(DependencyObject child) where T : class
    {
        var parent = VisualTreeHelper.GetParent(child);
        if (parent == null) return null;
        else if (parent is T) return parent as T;
        else return GetParent<T>(parent);
    }
    
    private void btnAllDone_Click(object sender, RoutedEventArgs e)
    {
        // Get current button
        var button = (Button)sender;
    
        // Get current expander
        var expander = GetParent<Expander>(button);
    
        // Toggle expander
        expander.IsExpanded = !expander.IsExpanded;
    }
    
    

    【讨论】:

      猜你喜欢
      • 2013-01-30
      • 2012-02-23
      • 1970-01-01
      • 2014-04-28
      • 1970-01-01
      • 2011-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多