wpf — обновленное свойство зависимостей не запускает привязку

У меня есть следующее DependencyProperty:

public bool IterationSelected
{
    get { return (bool)GetValue(IterationSelectedProperty); }
    set { SetValue(IterationSelectedProperty, value); }
}
public static readonly DependencyProperty IterationSelectedProperty =
  DependencyProperty.Register("IterationSelected", typeof(bool),
  typeof(MainMediator), new UIPropertyMetadata(false));

(это было создано из шаблона VS)

Затем у меня есть этот DataTrigger, который обновляет его:

<Grid.Style>
    <Style>
        <Style.Triggers>
            <DataTrigger Value="True">
                <DataTrigger.Binding>
                    <MultiBinding Converter="{StaticResource IsOpenFalseAndIsCheckedTrueMultiConverter}">
                        <Binding ElementName="popSelectIteration" Path="IsOpen"/>
                        <Binding ElementName="chkIteration" Path="IsChecked"/>
                    </MultiBinding>
                </DataTrigger.Binding>
                <Setter Property="loc:MainMediator.IterationSelected" Value="True"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</Grid.Style>

Наконец, у меня есть этот Grid, видимость которого зависит от свойства.

<Grid Visibility="{Binding IterationSelected, Converter={StaticResource BooleanToVisibilityConverter}, diagnostics:PresentationTraceSources.TraceLevel=High}" Grid.Row="1">
    <TextBlock>Testing 1323</TextBlock>
</Grid>

Итак, вот проблема, которую я использовал: diagnostics:PresentationTraceSources.TraceLevel="High" для проверки всех привязок, и все работает нормально, за исключением того, что когда loc:MainMediator:IterationSelected устанавливается в true, Grid не реагирует на него. Вообще ничего не горит. Дело не в том, что он не может связать или что-то в этом роде. Просто даже не пытается. Привязка Grid срабатывает только при запуске приложения. В это время он срабатывает и правильно оценивает.

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

Гуру WPF, есть идеи?


person Vaccano    schedule 22.01.2010    source источник


Ответы (2)


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

По сути, ваша привязка Grid.Visibility ищет свойство IterationSelected в текущем DataContext. Но ваш стиль DataTrigger устанавливает свойство loc:MainMediator.IterationSelected в сетке.

Исправление для этого состоит в том, чтобы ваша привязка Grid.Visibility искала свойство loc:MainMediator.IterationSelected в самой сетке (а не в DataContext). Для этого добавьте RelativeSource={RelativeSource Self} в объявление привязки:

Visibility="{Binding IterationSelected,
                     Converter={StaticResource BooleanToVisibilityConverter},
                     RelativeSource={RelativeSource Self}}">

Это говорит привязке смотреть на элемент, к которому она привязана, а не на DataContext.

Вам также может понадобиться изменить путь на loc:MainMediator.IterationSelected, а не просто на IterationSelected.

Наконец, в зависимости от того, выполняет ли свойство IterationSelected какие-либо другие задания, альтернативный подход состоит в том, чтобы ваш сеттер напрямую устанавливал видимость:

<DataTrigger Value="True">
  <!-- binding omitted -->
  <Setter Property="Visibility" Value="Visible" />
</DataTrigger>
person itowlson    schedule 22.01.2010

Setter в вашем образце пытается установить свойство IterationSelected в сетке, но DP принадлежит типу MainMediator. Вы намеревались установить значение MainMediator, и если да, то где оно по отношению к сетке? Похоже, вы можете вместо этого применить этот стиль к элементу управления MainMediator, но я не могу точно сказать по этому коду. Вы также упомянули о попытке использовать точку доступа, которая позволила бы вам установить IterationSelected в сети.

Можете ли вы дать больше контекста о том, что вы собираетесь сделать?

person John Bowen    schedule 29.01.2010