我在xaml中有一个GroupBox的样式声明。此样式声明包含一个包含按钮的ControlTemplate。我希望按钮的可见性取决于DataGrid是否将是GroupBox的子项。GroupBox是在代码隐藏中动态构建的。
在代码隐藏中,布尔值确定在创建DataGrid时,GroupBox是否将成为GroupBox的子级。
我考虑过为GroupBox使用布尔附加属性( AP ),它将指定DataGrid是否为GroupBox的子级,但我不确定如何在样式声明中声明这一点(或者我是否会在那里声明AP ),也不确定如何在代码隐藏中使用AP。
如何根据DataGrid的存在设置按钮的可见性属性?
有没有人能给我举个简单的例子,告诉我如何设置?
任何帮助都是非常感谢的!
发布于 2018-08-05 07:54:35
通常的方法是使用DataTrigger,不过也可以使用converter。无论采用哪种方法,您都需要在后台代码中绑定到该布尔值。我假设您已经将窗口设置为它自己的DataContext,所以只需执行以下操作:
<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:
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的内容,然后使用转换器将其转换为可见性设置:
<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的内容),检查它的类型并相应地返回可见性:
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中的按钮:
这回答了问题吗?
https://stackoverflow.com/questions/51690352
复制相似问题