wpf - обновленное свойство зависимости не вызывает привязку - PullRequest
3 голосов
/ 22 января 2010

У меня есть следующее 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 Gurus, есть идеи?

Ответы [ 2 ]

2 голосов
/ 22 января 2010

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

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

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

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

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

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

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

<DataTrigger Value="True">
  <!-- binding omitted -->
  <Setter Property="Visibility" Value="Visible" />
</DataTrigger>
1 голос
/ 29 января 2010

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

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

...