同じ問題が発生しましたが、代わりに TriggerAction を使用して解決しました。Blend SDKSystem.Windows.Interactivity
をお持ちの場合は、を使用できます。dll は次の場所にあります。
c:\Program Files\Microsoft SDKs\Expression\Blend\Silverlight\v4.0\Libraries\
System.Windows.Interactivity.dll`
次に、以前の xaml コードを使用して、データ テンプレートを次のように設定できます。
<ItemsControl.ItemTemplate>
<DataTemplate>
<Ellipse Stroke="Red" Width="2" Height="2">
<ia:Interaction.Triggers>
<ia:EventTrigger EventName="Loaded">
<tr:SetCanvasPropertiesAction Left="{Binding X}" Top="{Binding Y}" />
</ia:EventTrigger>
</ia:Interaction.Triggers>
</Ellipse>
</DataTemplate>
</ItemsControl.ItemTemplate>
ia:Interaction
前述のインタラクティブ dllのプレフィックスに注意してください。あなたはそれをロードします
xmlns:ia="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
xaml ファイルの先頭にあります。
tr プレフィックスは、次のような独自のクラスを含めるためのものです。
using System.Windows;
using System.Windows.Controls;
using System.Windows.Interactivity;
using System.Windows.Media;
namespace Presentation.Triggers {
public class SetCanvasPropertiesAction : TriggerAction<DependencyObject> {
public static readonly DependencyProperty LeftProperty =
DependencyProperty.Register("Left", typeof(double), typeof(SetCanvasPropertiesAction), new PropertyMetadata(default(double)));
public static readonly DependencyProperty TopProperty =
DependencyProperty.Register("Top", typeof(double), typeof(SetCanvasPropertiesAction), new PropertyMetadata(default(double)));
public double Top {
get { return (double)GetValue(TopProperty); }
set { SetValue(TopProperty, value); }
}
public double Left {
get { return (double)GetValue(LeftProperty); }
set { SetValue(LeftProperty, value); }
}
protected override void Invoke(object parameter) {
UIElement presenter = (UIElement)VisualTreeHelper.GetParent(AssociatedObject);
Canvas.SetLeft(presenter, Left);
Canvas.SetTop(presenter, Top);
}
}
}
Invoke メソッドで注意すべき点が 2 つあります。1 つ目はAssociatedObject
、トリガーが xaml でその下にネストされているため、Ellipse に解決されます。2 つ目は、楕円の親を取得する VisualTreeHelper です。これは、キャンバスの添付プロパティを設定する ContentPresenter です。
もっと複雑に見えるかもしれませんが、mvvm の他のすべてと同様に、xaml で再利用でき、コード ビハインド コードをどこにでもコピー アンド ペーストする必要はありません。