Обычно это делается с помощью DataTrigger, хотя вы также можете сделать это с помощью конвертера. В любом случае вам нужно будет выполнить привязку к этому логическому значению в вашем коде. Я предполагаю, что вы установили окно как собственный 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);
Затем в вашем стиле у вас есть ContentControl для групповых ящиков, содержащий кнопку, и вы хотите, чтобы эта кнопка была видна только в групповых ящиках, у которых есть DataGrid для дочернего элемента? Если это так, то вы можете сделать это достаточно легко с помощью конвертера. Вы привязываете свойство Visibility кнопки к содержимому GroupBox, а затем используете преобразователь для преобразования из него в параметр Visibility:
<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:
Это отвечает на вопрос?
person
Mark Feldman
schedule
04.08.2018