2013-01-20 2 views
2

Я просто надеялся, что вы сможете помочь заполнить пробел в моих знаниях WPF.Событие Trigger не работает на раскадровке

(пожалуйста, простите родовое именование, не уверен, если это поможет)

Я пользовательский объект, MyObject, который реализует INotifyPropertyChanged. Он имеет свойство MyCustomProperty, как указано ниже;

public int MyCustomProperty 
{ 
get { return this._myCustomProperty; } 
set 
{ 
    if (this._myCustomProperty == value) 
    return; 
    this._myCustomProperty= value; 
    OnPropertyChanged("MyCustomProperty"); 
} 
} 

Все это работает. В моем приложении WPF у меня есть эти 3 функции;

private void DoStuff() 
{ 
    AddItemsToCanvas(); 
    ChangeValues(); 
} 

private void AddItemsToCanvas() 
{ 
    DataTemplate dt = (DataTemplate)FindResource("myDataTemplate"); 
    foreach (MyObject temp in ListOfMyObjects) 
    { 
    ContentControl cc = new ContentControl(); 
    cc.ContentTemplate = dt; 
    cc.Content = temp; 
    myCanvas.Children.Add(cc); 
    } 
} 

private void ChangeValues() 
{ 
    // this simply changes the MyCustomPropery in each of the objects 
} 

DataTemplate выглядит так;

<DataTemplate x:Key="myDataTemplate"> 
<Canvas> 
    <TextBlock Name="tb_debug" Text="{Binding Path=MyCustomProperty, NotifyOnTargetUpdated=True}"> 
    <TextBlock.Triggers> 
    <EventTrigger RoutedEvent="Binding.TargetUpdated"> 
    <BeginStoryboard> 
     <Storyboard> 
     <DoubleAnimation Storyboard.TargetName="tb_debug" Storyboard.TargetProperty="(Canvas.Top)" From="0" To="350" Duration="0:0:1.6" /> 
     </Storyboard> 
    </BeginStoryboard> 
    </EventTrigger> 
    </TextBlock.Triggers> 
    </TextBlock> 
</Canvas> 
</DataTemplate> 

Он просто перемещает текстовое поле сверху вниз, когда изменяется MyCustomProperty.

При загрузке UserControl я вызываю как AddItemsToCanvas(), так и ChangeValues ​​(). Значение Text обновляется и отображает правильное значение, но Trigger не срабатывает (т. Е. TextBox не перемещается). В любое время после этого, когда я вызываю ChangeValues ​​(), меняются текстовые обновления и текстовое поле.

Почему EventTrigger не работает в это начальное время? заблаговременно

+0

Можете ли вы предоставить небольшой, но * полный * рабочий пример этой проблемы? Это будет намного проще, чем пытаться выяснить проблему из бит и частей ... – Blachshma

+0

Я не уверен, могу ли я - этот UserControl имеет около ~ 3000 строк кода, плюс сам класс, который примерно такой же , – ausgeorge

ответ

0

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

Но вы можете просто добавить еще один EventTrigger на TextBlockLoaded в вашем DataTremplate, чтобы убедиться, что он срабатывает на UserControl нагрузки.

Пример:

<DataTemplate x:Key="myDataTemplate"> 
    <DataTemplate.Resources> 
     <Storyboard x:Key="animation" > 
      <DoubleAnimation Storyboard.TargetName="tb_debug" Storyboard.TargetProperty="(Canvas.Top)" From="0" To="350" Duration="0:0:1.6" /> 
     </Storyboard> 
    </DataTemplate.Resources> 
    <Canvas> 
     <TextBlock Name="tb_debug" Text="{Binding Path=MyCustomProperty, NotifyOnTargetUpdated=True}"> 
      <TextBlock.Triggers> 
      <EventTrigger RoutedEvent="Binding.TargetUpdated"> 
       <BeginStoryboard Storyboard="{StaticResource animation}" /> 
      </EventTrigger> 
       <EventTrigger RoutedEvent="Loaded"> 
       <BeginStoryboard Storyboard="{StaticResource animation}" /> 
      </EventTrigger> 
      </TextBlock.Triggers> 
     </TextBlock> 
    </Canvas> 
</DataTemplate> 
+0

Спасибо за обход, который сработал. Сегодня я сделаю еще несколько тестов, чтобы попытаться точно определить, что происходит с этим первым событием. – ausgeorge

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