我有一個讓史蒂夫帕瑟利斯的想法工作。這花了一段時間 - 自定義依賴屬性很容易出錯。它看起來像SetXXX
是錯誤的地方放你的副作用 - WPF不必去那裏,它可以直接去DependencyObject.SetValue
,但總是會調用PropertyChangedCallback
。
所以,這裏的完整和工作自定義附加屬性代碼:
using System.Windows;
using System.Windows.Input;
namespace WpfApplication1
{
public static class PropertyHelper
{
public static readonly DependencyProperty DropCommandProperty = DependencyProperty.RegisterAttached(
"DropCommand",
typeof(ICommand),
typeof(PropertyHelper),
new PropertyMetadata(null, OnDropCommandChange));
public static void SetDropCommand(DependencyObject source, ICommand value)
{
source.SetValue(DropCommandProperty, value);
}
public static ICommand GetDropCommand(DependencyObject source)
{
return (ICommand)source.GetValue(DropCommandProperty);
}
private static void OnDropCommandChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
ICommand command = e.NewValue as ICommand;
UIElement uiElement = d as UIElement;
if (command != null && uiElement != null)
{
uiElement.Drop += (sender, args) => command.Execute(args.Data);
}
// todo: if e.OldValue is not null, detatch the handler that references it
}
}
}
在要使用此XAML標記,你可以做如
xmlns:local="clr-namespace:WpfApplication1"
...
<Button Content="Drop here" Padding="12" AllowDrop="True"
local:PropertyHelper.DropCommand="{Binding DropCommand}" />
..其餘的只是確保你的ViewModel,綁定和命令是正確的。
該版本將IDataObject
傳遞給我看起來更好的命令 - 您可以查詢它的文件或命令中的任何內容。但這只是當前的偏好,而不是答案的基本特徵。
有沒有機會看到一些代碼? ScatterViewItems如何持有兒童控件?你如何將它綁定到視圖模型? – 2009-06-25 19:34:33