2010-01-22 3 views
3

У меня есть следующие 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 получает значение ИСТИНА, то Grid не делает погрузку на него. Ничего не срабатывает. Дело не в том, что оно не может связываться или что-то в этом роде. Он просто даже не пытается. Единственный раз, когда Grid обязательные огни находятся в начале приложения. В это время он стреляет и правильно оценивает.

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

WPF Гуру, любые идеи?

ответ

2

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

В основном ваша Grid.Visibility binding ищет 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> 
1

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

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

Смежные вопросы