2013-10-31 1 views
0

목록 뷰를 포함하는 usercontrol이있는 메인 윈도우가 있습니다. 사용자 정의 컨트롤에는 listview의 모든 내용을 클립 보드에 복사하는 버튼이 있습니다. 복사 기능이 구현 된 방법입니다. 복사에 관한 UserControl을의 뷰 모델의 코드 아래사용자 컨트롤의 뷰 모델에 대한 주 윈도우의 뷰 모델에서 KeyBinding의 링크 명령 commandbindings

public class AttachedProperties 
{ 
public static DependencyProperty CommandBindingsProperty = 
     DependencyProperty.RegisterAttached("CommandBindings", typeof(CommandBindingCollection), typeof(AttachedProperties), 
     new PropertyMetadata(null, OnCommandBindingsChanged)); 
public static void SetCommandBindings(UIElement element, CommandBindingCollection value) 
    { 
     if (element != null) 
      element.SetValue(CommandBindingsProperty, value); 
    } 
    public static CommandBindingCollection GetCommandBindings(UIElement element) 
    { 
     return (element != null ? (CommandBindingCollection)element.GetValue   (CommandBindingsProperty) : null); 
    } 
} 

한다 - 코드 아래에있다 -

<Button Command="Copy" 
    CommandTarget="{Binding ElementName=testCodeView}" 
    CommandParameter="Copy" 
</Button> 

<ListView x:Name="testCodeView" 
     ItemsSource="{Binding Products}" BorderThickness="0" Grid.Row="1" 
     ItemTemplate="{StaticResource testViewTemplate}"  
     ItemContainerStyle="{StaticResource testCodesListItem}" 
     infra:AttachedProperties.CommandBindings ="{Binding CommandBindings}"> 
</ListView> 

AttachedProperties 클래스는 종속성 속성 "있는 CommandBindings을"보유 - 아래 은 UserControl을의 XAML의 일부입니다 listview의 항목.

public class UserControlViewModel : INotifyPropertyChanged 
{ 
    public CommandBindingCollection CommandBindings 
    { 
     get 
     { 
      if (commandBindings_ == null) 
      { 
       commandBindings_ = new CommandBindingCollection(); 
      } 
      return commandBindings_; 
     } 
    } 
    public UserControlViewModel 
    { 
     CommandBinding copyBinding = new CommandBinding(ApplicationCommands.Copy, 
     this.CtrlCCopyCmdExecuted, this.CtrlCCopyCmdCanExecute); 
     // Register binding to class 
     CommandManager.RegisterClassCommandBinding(typeof(UserControlViewModel), copyBinding); 
     this.CommandBindings.Add(copyBinding); 
    } 
    private void CtrlCCopyCmdExecuted(object sender, ExecutedRoutedEventArgs e) 
    { 
     copyToclipboard_.CtrlCCopyCmdExecuted(sender, e); 
    } 
} 

CtrlCCopyCmdExecuted 함수 송신자 개체 학습과 그 컨텐츠를 복사 사용된다 UserControl을리스트 뷰에서이다. 모든 기능 복사는 사용자 정의 컨트롤의 버튼으로 잘 작동합니다. mainwindow에서 복사 기능을위한 키 바인딩을 만들어야합니다. MainWindowViewModel에서 명령을 정의 할 때 잘 작동하는 mainwindow에서 다른 키 바인딩을 만들었지 만 모든 명령을 복사하는 commandbindings는 usercontrol의 뷰 모델에 있기 때문에 mainwindowviewmodel에서 keybinding 명령과 usercontrolviewmodel의 commandbinding 명령을 연결하는 데 문제가 있습니다. . 누군가 나를 도와 줄 수 있습니까?

미리 감사드립니다.

답변

0

상위 뷰 모델이 하위 뷰 모델에 액세스 할 수있는 경우 두 가지 주요 옵션이 있습니다. 두 옵션 모두 상위 뷰 모델에 BindICommand 속성을 만드는 것을 포함한다 :

<KeyBinding Gesture="CTRL+C" Command="{Binding Copy, Mode=OneWay}" /> 

첫 번째 옵션이있는 abstract ICommand 속성을 가진 BaseViewModel 클래스를 만드는 작업이 포함됩니다 ... 가 가지고있는 BaseViewModel 클래스를 확장하는 클래스를이 명령을 구현하는 ... 당신은이 유형의 아이 뷰 모델 속성을 가질 수 단순히 따라 값 성공 : 당신이 그 명령을 원하는 나는 의심

public override ICommand Copy 
{ 
    get { return new ActionCommand(action => ViewModel.Copy.Execute(null), 
canExecute => ViewModel.Copy != null); } 
} 

을 모든 뷰 모델을 살펴 보겠습니다. 옵션 2를 살펴 보겠습니다. 기본적인 아이디어는 당신이 아이 뷰 모델에 액세스 할 수있는 경우, 당신은 아이에 따라 명령을 '통과'할 수 있다는 것입니다 :

public ICommand Copy 
{ 
    get { return new ActionCommand(action => childViewModel.Copy.Execute(action), 
canExecute => childViewModel.Copy.Execute(canExecute)); } 
} 

ActionCommand는 일반적인 RelayCommand을 기반으로하는 사용자 정의 클래스입니다.


UPDATE >>>

좋아, 그래서 전에 CommandBindings을 사용한 적이 내 ActionCommand, 또는 RelayCommand를 사용하여 너무 훨씬 쉽게,하지만 난 그냥 MSDN과 두에 조사했기 때문에 아이디어 봄. 당신이 아이 UserControlApplicationCommands.Copy 명령 개체를 사용하는 경우

첫째, 다음 확실히 당신은 부모 뷰에서 KeyBinding에서 같은 객체를 사용할 수 있습니다.ApplicationCommandsstatic 클래스와 Copystatic 속성입니다, 그래서 당신이 그것을 호출 할 때마다, 그것은 같은 개체의 : 그 실패

<KeyBinding Gesture="CTRL+C" Command="ApplicationCommands.Copy" /> 

, 당신은 당신의 부모 뷰 모델에 ICommand 속성을 생성하거나 생성 할 수 있습니다 당신의 자신의 Copy 명령을 사용하거나 ApplicationCommands.Copy 명령을 반환하십시오. 그런 다음 부모보기 하위보기에서 Bind 수 있습니다 ... 또는 상위보기 모델에서 하위보기 CommandBinding 개체에 추가 할 수도 있습니다.

+0

감사합니다. Sheridan. 하지만이 솔루션을 구현할 때 몇 가지 문제가 발생할 수 있습니다. childViewModel에는 복사 할 특정 명령이 없습니다. Commandbindings라는 종속성 속성을 사용합니다 (위의 usercontrol xaml 및 AttachedProperties 클래스를 살펴보십시오). parenViewModel에서 childViewModel의 Commandbindings에 액세스 할 수 있습니다. 어쨌든 명령을 실행하기 위해 사용할 수 있습니까? 또한 Executed 이벤트 핸들러의 보낸 사람 객체는 listview 여야합니다 (복사 버튼의 commandtarget은 listview 임). – rajat