2011-10-05 2 views
15

,사용자 정의 컨트롤에서 바인드 가능 명령을 작성하는 방법은 무엇입니까? 내 SomeCustomControl에서 다음과 같은 코드를 가정

public class SomeViewModel{ 
     ICommand ReloadCommand{get...} 
     ICommand SaveCommand{get..} 
} 

//SomeView.xaml 
<SomeCustomControl Reload="ReloadCommand" Save="SaveCommand" /> //NOT SURE HOW?? 

//SomeCustomContro.xaml 
<SomeCustomControl x:Name="someCustomControl"> 
<Button Command={Binding ElementName=someCustomControl, Path=Reload /> 
<Button Command={Binding ElementName=someCustomControl, Path=Save /> 
</SomeCustomControl> 

//SomeCustomControl.xaml.cs 
..... //NOT SURE HOW TO ALLOW BINDING TO A ICOMMAND ?? 

, 나는 "XAML에서 ICommand의 결합"을 지원해야합니다. DependencyProperties가 이와 같이 바인딩 될 수 있음을 이해합니다. 그러나이 경우 ICommand를 바인딩해야합니다.

누군가가이 작업을 수행하는 가장 좋은 방법을 제안 할 수 있습니까? 방향이 누락 되었기 때문에 제시된 자료 나 링크가 사용됩니다.

EDIT 1) SomeCustomControl에서 DataContext SomeView를 사용할 수 있습니다. 내가 분해 할 수없는 두 가지 논리와 분리가 더 있습니다. 필자는 SomeCustomControl 어딘가에 Reload/Save ICommands에 대한 참조를 유지해야합니다.

고마워요.

답변

31

나를 똑바로 보내 주겠다. ReloadSave에 바인딩하고 싶습니까? 선언하고이 종속성 속성 ReloadCommandPropertySomeCustomControl에 대한 유형 ICommandSaveCommandProperty을 정의, 생성해야

그래서. 작업을 시작합니다 RelodCommandSaveCommand 특성이 적절한 바인딩 후 그래서 SomeCustomControlControl에서 파생 가정

...

public class SomeCustomControl : Control 
{ 
    public static DependencyProperty ReloadCommandProperty 
     = DependencyProperty.Register(
      "ReloadCommand", 
      typeof (ICommand), 
      typeof (SomeCustomControl)); 

    public static DependencyProperty SaveCommandProperty 
     = DependencyProperty.Register(
      "SaveCommand", 
      typeof(ICommand), 
      typeof(SomeCustomControl)); 

    public ICommand ReloadCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(ReloadCommandProperty); 
     } 

     set 
     { 
      SetValue(ReloadCommandProperty, value); 
     } 
    } 

    public ICommand SaveCommand 
    { 
     get 
     { 
      return (ICommand)GetValue(SaveCommandProperty); 
     } 

     set 
     { 
      SetValue(SaveCommandProperty, value); 
     } 
    } 
} 

...

 <SomeCustomControl RelodCommand="{Binding ViewModelReloadCommand}" 
         SaveCommand="{Binding ViewModelSaveCommand}" /> 
2

명령을 반환하고 필요한 경우이 속성을 바인딩하는 속성을 만듭니다.

private ICommand _reloadCommand; 
public ICommand ReloadCommand 
{ 
    get 
    { 
    if(_reloadCommand == null) _reloadCommand = CreateReloadCommand(); 
    return _reloadCommand; 
    } 
} 

변경은

<Button Command={Binding ReloadCommand}" /> 

에 코드에서 바인딩 및 명령을 포함하는 뷰 모델에 사용자 지정 컨트롤의 DataContext를 바인딩합니다.

+0

당신은 내가 직접 바인딩 할 수 있습니다 의미합니까 ICommand 인스턴스를 컨트롤의 속성에 ?? 또한, "CreateReloadCommand"는 무엇입니까? 이 명령 인스턴스는 ViewModel에서 만들어지며 SomeCustomControl은 xaml 바인딩을 사용하여 해당 인스턴스 참조를 저장하면됩니다. –

+0

ICommand 타입의 값을 원하는대로 바인딩 할 수 있습니다. 바인딩에 대한 가장 중요한 의존성 속성은'ButtonBase.CommandProperty'입니다. 'CreateReloadCommand'는 커맨드를 생성하는 메소드입니다. 커맨드 생성과 초기화 코드를 쓰고 싶지 않았습니다. 내 대답을 타이핑 할 때, 코드에서 명령을 (나중에 변경 했음) 명령을 사용합니다. –

관련 문제