Вручную оценить условия - PullRequest
       1

Вручную оценить условия

2 голосов
/ 13 сентября 2011

Я хочу установить для свойства «Видимость» элемента управления указанное значение, когда все условия выполняются.Как в следующем примере:

    <TextBlock Text="TEST">
        <e:Interaction.Behaviors>
            <bhv:VisibilityBehaviour VisibilityIfTrue="Visible" VisibilityIfFalse="Collapsed">
                <Condition Binding="{Binding BOOL1}" Value="true"/>
                <Condition Binding="{Binding BOOL2}" Value="true"/>
                <Condition Binding="{Binding BOOL3}" Value="true"/>
            </bhv:VisibilityBehaviour>
        </e:Interaction.Behaviors>
    </TextBlock>

Как я могу вручную оценить эти условия?Я знаю, как получить значение, но если значение изменяется, я не уведомлен.

Я знаю, что могу получить значение цели привязки, используя отражения.Затем я могу сравнить оба этих значения из условия.

С помощью атрибута [ContentProperty ("Условия")] условия между тегами VisibilityBehavior добавляются в список.

VisibilityBehavior.cs

[ContentProperty("Conditions")]
public class VisibilityBehaviour : Behavior<FrameworkElement>
{
    public static readonly DependencyProperty VisibilityProperty;
    public Visibility Visibility
    {
        get { return (Visibility)GetValue(VisibilityProperty); }
        set { SetValue(VisibilityProperty, value); }
    }

    public Visibility VisibilityIfTrue { get; set; }
    public Visibility VisibilityIfFalse { get; set; }
    public List<Condition> Conditions { get; set; }

    static VisibilityBehaviour()
    {
        VisibilityProperty = DependencyProperty.Register("Visibility", typeof(Visibility), typeof(VisibilityBehaviour), new UIPropertyMetadata(Visibility.Visible));
    }
    public VisibilityBehaviour()
    {
        Conditions = new List<Condition>();
    }

    protected override void OnAttached()
    {
        base.OnAttached();

        FrameworkElement obj = AssociatedObject as FrameworkElement;
        if (obj == null)
            return;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        FrameworkElement obj = AssociatedObject as FrameworkElement;
        if (obj == null)
            return;
    }
}

Как получить уведомление, если значение привязки изменилось, например: BOOL1 имеет значение false, а затем изменяется на true.

ОБНОВЛЕНИЕ: теперь используются конвертеры

MultiValueConverter, если все BOOL имеют значение true, тогда он возвращает Visibility.Visible, иначе .Collapsed

<MultiBinding Converter="{StaticResource VisibilityConverter}" ConverterParameter="true">
    <Binding Path="BOOL1"/>
    <Binding Path="BOOL2"/>
    <Binding Path="BOOL3"/>
</MultiBinding>

ValueConverter, здесь он не уведомляет об изменении значения Binding условия, но здесь я могу добавить все условия

<Binding Converter="{StaticResource VisibilityConverter}">
    <Binding.ConverterParameter>
        <ConditionCollection >
            <Condition Binding="{Binding BOOL1}" Value="true"/>
            <Condition Binding="{Binding BOOL2}" Value="true"/>
            <Condition Binding="{Binding BOOL3}" Value="true"/>
        </ConditionCollection>
    </Binding.ConverterParameter>
</Binding>

Мне нужно сочетание этих двух конвертеров, потому что

  • Я хочу добавить условия в xaml (как в ValueConverter)
  • Необходимо обновить, еслизначение привязки изменяется

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 13 сентября 2011

Вы не получаете уведомления, потому что объект Binding не изменяется. Однако значение привязок Source и Target Properties соответствует, так что вы можете захотеть расширить свой класс Condition (если он ваш) для регистрации в событиях TargetUpdated или SourceUpdate привязки и дальнейшего распространения этого события.

http://msdn.microsoft.com/de-de/library/system.windows.data.binding.aspx

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

Надеюсь, это поможет.

Кроме того, как уже упоминалось, вы могли бы решить свою проблему с помощью MultiBindings, отбросив концепцию поведения.

0 голосов
/ 14 октября 2011

Вы в WPF используете триггеры стилей с MultiDataTrigger.http://msdn.microsoft.com/en-us/library/system.windows.multidatatrigger.aspx

<Style TargetType="TextBlock">
  <Setter Property="Visibility" Value="Collapsed" />
  <Style.Triggers>
    <MultiDataTrigger>
      <MultiDataTrigger.Conditions>
        <Condition Binding="{Binding Binding1}" Value="Condition1" />
        <Condition Binding="{Binding Binding2}" Value="Condition2" />
      </MultiDataTrigger.Conditions>
      <Setter Property="Visibility" Value="Visible" />
    </MultiDataTrigger>
  </Style.Triggers>
</Style>
0 голосов
/ 13 сентября 2011

Надеюсь, я правильно понял вашу проблему:

Вы можете использовать IMultiValueConverter вместе с MultiBinding, чтобы связать свойство управления с более чем одним свойством модели, и внутри конвертера оценить результат.

Посмотрите пример.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...