2

私の WPF 知識のギャップを埋めるのに役立つことを願っていました。

(一般的な命名を許してください。それが役立つかどうかはわかりません)

INotifyPropertyChanged を実装するカスタム オブジェクト MyObject があります。次のように、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() を呼び出すと、Text が更新され、TextBox が移動します。

EventTrigger が最初に失敗するのはなぜですか? 前もって感謝します

4

1 に答える 1

3

が呼び出されない理由はわかりBinding.TargetUpdatedませんが、最初に設定されたときではなく、ターゲットが既に設定されているときにのみ呼び出される可能性があります(おそらく)。

ただし、別のEventTriggeronTextBlock Loadedを追加して、ロード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>
于 2013-01-20T20:26:20.103 に答える