2012-07-26 68 views
1

我創建了一個Dependency屬性來處理樹視圖的鼠標雙擊事件。 這是部分工作,當你雙擊樹視圖項目在我的視圖模型中調用所需的方法,現在我想要做的是通過點擊項目(XmlElement)到這個方法。我添加了另一個依賴項屬性,但每次我雙擊樹視圖項時,方法中的XmlElement參數是null處理WPF TreeView鼠標雙擊使用MVVM

有一些外部庫,如:

1)Expression.Sample.Interactivity

2)Attached Command Behavior

,但我一直要求實現自己的東西,我會很感激,如果有人可以建議我去哪裏錯了。我已經包括以下必需的源代碼:

處理依賴屬性的類:

public static class CommandBehavior 
    { 

    public static readonly DependencyProperty DoubleClickCommand = 
    EventBehaviourFactory.CreateCommandExecutionEventBehaviour(
    TreeView.MouseDoubleClickEvent, 
    "DoubleClickCommand", 
typeof(CommandBehavior)); 

public static void SetDoubleClickCommand(DependencyObject o, ICommand value) 
{ 
    o.SetValue(DoubleClickCommand, value); 
} 

public static ICommand GetDoubleClickCommand(DependencyObject o) 
{ 
    return o.GetValue(DoubleClickCommand) as ICommand; 
} 

public static readonly DependencyProperty CommandParameterProperty = 
DependencyProperty.RegisterAttached("CommandParameter", 
typeof(object), 
typeof(CommandBehavior), 
new FrameworkPropertyMetadata((object)null, 
    new PropertyChangedCallback(OnCommandParameterChanged))); 

public static object GetCommandParameter(DependencyObject d) 
{ 
    return (object)d.GetValue(CommandParameterProperty); 
} 

public static void SetCommandParameter(DependencyObject d, object value) 
{ 
    d.SetValue(CommandParameterProperty, value); 
} 

private static void OnCommandParameterChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
{ 
} 

}

public static class EventBehaviourFactory 
{ 
public static DependencyProperty CreateCommandExecutionEventBehaviour(RoutedEvent routedEvent, string propertyName, Type ownerType) 
{ 
    DependencyProperty property = DependencyProperty.RegisterAttached(propertyName, typeof(ICommand), 
     ownerType, new PropertyMetadata(null, 
      new ExecuteCommandOnRoutedEventBehaviour(routedEvent).PropertyChangedHandler)); 
    return property; 
} 

}

public class ExecuteCommandOnRoutedEventBehaviour : ExecuteCommandBehaviour 
{ 
    private readonly RoutedEvent _routedEvent; 
    public ExecuteCommandOnRoutedEventBehaviour(RoutedEvent routedEvent) 
    { 
     _routedEvent = routedEvent; 
    } 

protected override void AdjustEventHandlers(DependencyObject sender, object oldValue, object newValue) 
{ 
    UIElement element = sender as UIElement; 
    if (element == null) 
     return; 

    if (oldValue != null) 
    { 
     element.RemoveHandler(_routedEvent, new RoutedEventHandler(EventHandler)); 
    } 
    if (newValue != null) 
    { 
     element.AddHandler(_routedEvent, new RoutedEventHandler(EventHandler)); 
    } 
} 

protected void EventHandler(object sender, RoutedEventArgs e) 
{ 
    HandleEvent(sender, e); 
} 

}

public abstract class ExecuteCommandBehaviour 
{ 
protected DependencyProperty _property; 
protected abstract void AdjustEventHandlers(DependencyObject sender, object oldValue, object newValue); 
protected void HandleEvent(object sender, EventArgs e) 
{ 
    DependencyObject dp = sender as DependencyObject; 
    if (dp == null) 
     return; 

    DelegateCommand<XmlElement> command = dp.GetValue(_property) as DelegateCommand<XmlElement>; 
    if (command == null) 
    { 
     return; 
    } 
    command.Execute(sender as XmlElement); 
} 

public void PropertyChangedHandler(DependencyObject sender, DependencyPropertyChangedEventArgs e) 
{ 
    if (_property == null) 
     _property = e.Property; 

    object oldValue = e.OldValue; 
    object newValue = e.NewValue; 
    AdjustEventHandlers(sender, oldValue, newValue); 
} 

}

相關XAML:

<TreeView Name="treeView1" 
      local:CommandBehavior.DoubleClickCommand="{Binding ClickedItem}" 
      local:CommandBehavior.CommandParameter="{Binding ElementName=treeView1, Path=SelectedItem}"> 

視圖模型:

public partial class FieldTreeViewModel : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged = delegate { }; 

     private DelegateCommand<XmlElement> _clickedItem; 
     public DelegateCommand<XmlElement> ClickedItem 
     { 
      get { return _clickedItem; } 
      set 
      { 
       _clickedItem = value; 
       OnPropertyChanged("ClickedItem"); 
      } 
     } 

     public FieldTreeViewModel() 
     { 
      ClickedItem = new DelegateCommand<XmlElement>(InsertContentControl); 
     } 

     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      if (PropertyChanged != null) 
       PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     private void InsertContentControl(XmlElement selectedElement) 
     { 
      //The method always get's executed when tree view item is double clicked but 
      //the selectedElement parameter is always null 
     } 
    } 

回答

5

將斷點在此行

command.Execute(sender as XmlElement); 

你會發現發件人是XmlElement類型的不(這是樹視圖),因此你總是得到null。 您必須檢索您綁定的CommandParameter(它是XmlElement),並將其指定給Execute調用。