首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何基于DataGrid子级设置xaml样式ControlTemplate中按钮的可见性

如何基于DataGrid子级设置xaml样式ControlTemplate中按钮的可见性
EN

Stack Overflow用户
提问于 2018-08-05 07:39:52
回答 1查看 293关注 0票数 0

我在xaml中有一个GroupBox的样式声明。此样式声明包含一个包含按钮的ControlTemplate。我希望按钮的可见性取决于DataGrid是否将是GroupBox的子项。GroupBox是在代码隐藏中动态构建的。

在代码隐藏中,布尔值确定在创建DataGrid时,GroupBox是否将成为GroupBox的子级。

我考虑过为GroupBox使用布尔附加属性( AP ),它将指定DataGrid是否为GroupBox的子级,但我不确定如何在样式声明中声明这一点(或者我是否会在那里声明AP ),也不确定如何在代码隐藏中使用AP。

如何根据DataGrid的存在设置按钮的可见性属性?

有没有人能给我举个简单的例子,告诉我如何设置?

任何帮助都是非常感谢的!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-05 07:54:35

通常的方法是使用DataTrigger,不过也可以使用converter。无论采用哪种方法,您都需要在后台代码中绑定到该布尔值。我假设您已经将窗口设置为它自己的DataContext,所以只需执行以下操作:

代码语言:javascript
复制
<Button Content="Press Me" HorizontalAlignment="Left" VerticalAlignment="Top">
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding YourBooleanValue}" Value="False">
                    <Setter Property="Visibility" Value="Hidden" />
                </DataTrigger>
                <DataTrigger Binding="{Binding YourBooleanValue}" Value="True">
                    <Setter Property="Visibility" Value="Visible" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

更新:

好的,根据你在下面提供的额外信息,我想我现在明白你想要做什么了。如果这其中有任何错误,请纠正我,但听起来像是你在创建GroupBox,并给他们中的一些人一个孩子的DataGrid:

代码语言:javascript
复制
        var groupBox1 = new GroupBox();
        this.thePanel.Children.Add(groupBox1);

        var groupBox2 = new GroupBox();
        var dataGrid = new DataGrid();
        dataGrid.Columns.Add(new DataGridTextColumn { Header = "Column1" });
        dataGrid.Columns.Add(new DataGridTextColumn { Header = "Column2" });
        dataGrid.Columns.Add(new DataGridTextColumn { Header = "Column3" });
        groupBox2.Content = dataGrid;
        this.thePanel.Children.Add(groupBox2);

那么,在您的样式中,您有一个包含按钮的GroupBoxes的ContentControl,并且您只希望该按钮在具有子对象DataGrid的分组框中可见?如果是这样的话,你可以用转换器很容易的做到这一点。将按钮的可见性属性绑定到GroupBox的内容,然后使用转换器将其转换为可见性设置:

代码语言:javascript
复制
    <conv:ChildVisibilityConverter x:Key="ChildVisibilityConverter" />

    <Style TargetType="{x:Type GroupBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="GroupBox">
                    <Border BorderBrush="Black" BorderThickness="1" CornerRadius="10" Margin="5" Padding="5" >
                        <StackPanel Orientation="Vertical">
                            <TextBlock Text="Group Box" />
                            <Button Content="Click Me" HorizontalAlignment="Left" VerticalAlignment="Top"
                                    Visibility="{TemplateBinding Content, Converter={StaticResource ChildVisibilityConverter}}" />
                            <ContentPresenter />
                        </StackPanel>
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

实际的转换器本身只是简单地查看它得到了什么(即GroupBox的内容),检查它的类型并相应地返回可见性:

代码语言:javascript
复制
public class ChildVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return Visibility.Hidden;
        return (value.GetType() == typeof(DataGrid))
            ? Visibility.Visible
            : Visibility.Hidden;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

因此,对于我在上面发布的代码块,您只会看到第二个GroupBox中的按钮:

这回答了问题吗?

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51690352

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档