Многослойная сетка с разными стилями, дочерний стиль не запускает WPF

#wpf #xaml

#wpf #xaml

Вопрос:

Лакомый кусочек: это можно сделать только в XAML, без C #, поскольку у меня нет к нему доступа.

У меня есть дилемма, когда у меня есть сетка в форме (основная сетка, которая управляет всеми другими элементами управления) со стилем, который включает / отключает содержимое в зависимости от пользователя. Теперь я добавил флажок, в зависимости от которого зависит стиль, который будет скрывать / показывать поле группы. Моя проблема в том, что этот стиль не запускается, хотя применяется начальный параметр настройки:

     <Style x:Key="StatusVisibility">
      <Setter Property="Control.Visibility" Value="Hidden"/>
        <Style.Triggers>                
            <DataTrigger Binding="{Binding Source={StaticResource Dsource}, Path=Value.Properties[chkbox1].Value}" Value="Y">
                <Setter Property="Control.Visibility" Value="Visible"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
  

Таким образом, в этом случае видимость будет установлена на скрытую, и я не смогу ее увидеть, если я переверну настройки здесь (изначально видимость видна), будет отображаться поле группы.

Чтобы сделать вещи немного более странными, этот флажок установлен для базы данных, так что, если это «Y» или «N», задается видимость:

 <CheckBox  Grid.Row="0"  Grid.Column="0" Margin="2,0,2,0" VerticalContentAlignment="Center" Name="ckbox1" HorizontalAlignment="Left"  Width="Auto" MinWidth="100" 
                           IsChecked="{Binding Source={StaticResource Dsource}, Path=Value.Properties[ckbox1].Value,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}"
                           Content = "Display ?"/>
  

Вот поле группы, которое я пытаюсь установить:

 <GroupBox Header="GroupBox" Name="GroupBox" VerticalAlignment="Top" ClipToBounds="False" Margin="2,0,2,0" Style="{StaticResource StatusVisibility}">
  

Теперь, к чему я клоню, существуют ли конкретные правила, которым необходимо следовать, когда есть две сетки, и стиль родительских сеток переопределяет стиль дочерних сеток?

Кроме того, если бы я хотел, чтобы это поле дочерней группы включалось / отключалось на лету, должен ли я делать что-то особенное?

Спасибо

Комментарии:

1. Я предполагаю, что свойство, к которому вы пытаетесь привязаться в своем, DataTrigger запускает какое-то INotifyPropertyChanged событие при его изменении? Это потребуется, если вы хотите, чтобы это DataTrigger срабатывало при изменении этого свойства.

2. @GEEF Нет, поскольку у меня есть доступ только к XAML. Должен ли я просто создать значение bool в XAML и управлять этим стилем? Но тогда как бы я сохранил это, а затем отправил в базу данных?

3. Есть ли какой-либо способ узнать, поддерживает ли свойство INPC?

4. @GEEF Я не думаю напрямую, но я нашел это, что может помочь вызвать это: <cmds:CommandTrigger x:Name="SetStatusCommandCollectionTrigger" Event="OnPageLoad" CommandParameter="{StaticResource SetStatusDefaultCommandCollection}" />

Ответ №1:

Если у вас нет кода для access, вы можете сделать все это в xaml, привязав свой GroupBox.Visibility к своему CheckBox.IsChecked свойству:

 <StackPanel>
    <GroupBox Visibility="{Binding ElementName=MyCheckbox, Path=IsChecked, Converter={VisibilityConverter}}"/>
    <CheckBox x:Name="MyCheckbox" />
</StackPanel>
  

Для этого потребуется создать VisibilityConverter (простой поиск в Google). Затем вы можете удалить свой DataTrigger .

Комментарии:

1. Работает как шарм! ОДНАКО есть ли способ установить видимость с «Свернуть» на «Скрытый»? Или это ответственность конвертера? <BooleanToVisibilityConverter x:Key="BoolToVis" />

2. Игнорируйте этот последний комментарий, по-видимому, вам нужно исправить свой собственный в C #. Спасибо за вашу помощь!

3. Как правило, за это отвечает конвертер, и, кстати, это очень распространенное дополнение к VisibilityConverter. Вы могли бы передать ему параметр «СКРЫТЫЙ», затем внутри вашего Convert метода проверьте свой объект параметра.