2014-09-18 8 views
9

Xamarin.Forms.ButtonCommand에 내 ViewModel에 CommandParameter으로 전달하고 싶습니다. 예를 들어 코드 뒤에서이 작업을 수행하는 방법을 알고 있습니다. ...Xamarin.Forms 페이지에서 Button을 CommandParameter로 XAML에서 전달하는 방법은 무엇입니까?

XAML뷰 모델

<Button x:Name="myButton" 
    Text="My Button" 
    Command="{Binding ButtonClickCommand}"/> 

XAML.cs

public partial class MyTestPage 
{ 
    public MyTestPage() 
    { 
     InitializeComponent(); 

     myButton.CommandParameter = myButton; 
    } 
} 

(대부분의 속성은 간결 놓쳤다와)

public class MyViewModel : ViewModelBase 
{ 
    public MyViewModel() 
    { 
     ButtonClickCommand = new Command(
      (parameter) => 
      { 
       var view = parameter as Xamarin.Forms.Button; 
       if (view != null) 
       { 
        // Do Stuff 
       } 
      }); 
    } 

    public ICommand ButtonClickCommand { get; private set; } 
} 

... 그러나 XAML 자체에 CommandParameter을 선언 할 수 있습니까? 또는 다른 말로하면 버튼 자체에 매개 변수를 설정하는 바인딩 구문은 무엇입니까?

<Button x:Name="myButton" 
     Text="My Button" 
     Command="{Binding ButtonClickCommand}" 
     CommandParameter="{[WHAT WOULD GO HERE]}"/> 

btw 이미 CommandParameter="{Binding RelativeSource={RelativeSource Self}}"을 시도했지만 작동하지 않았습니다.

감사합니다,

+0

왜 VM에 버튼이 필요합니까? –

+0

안녕하세요 @AlexAnderson. 그래, 나도 슈퍼 예민하지 않아. Xamarin.Forms를 기존 Xamarin iOS 프로젝트에 도입하고 있습니다. 네이티브 UIPopoverController를 Xamarin.Form 페이지에서 보여줄 수있는 방법을 실험 해보자. Popups에 대한 Forms 지원이 없으므로 현재 주위를 둘러보고있는 장애물 중 하나에서 팝업을 표시 할 UIElement를 알 필요가 있습니다. 따라서 버튼을 전달합니다. 내가 말했듯이 ... 다소 기분이 이상합니다. 나는 아래에 당신의 제안을 시도 갈거야. 감사합니다 –

+0

팝업에 관해서는'ContentPage.DisplayActionSheet (...) '의 구현을 확인하십시오 - 액션 시트가 충분하지 않은 경우이를 보여주는 코드를 리버스 엔지니어링 할 수 있습니다. 그리고 Button 레퍼런스를 얻는 것은 여전히 ​​그것으로부터 UIButton 레퍼런스를 찾는 것을 요구할 것입니다. 사용자 지정 렌더러를 사용하면 더 편리해질 것입니다. –

답변

-1
<Button x:Name="myButton" 
    Text="My Button" 
    Command="{Binding ButtonClickCommand}" 
    CommandParameter={Binding RelativeSource= 
           {RelativeSource 
           Mode=FindAncestor, 
           AncestorType={x:Type Button}}/> 

작동해야하지만, 여전히 손실에서 메신저 당신은 버튼을 필요한 이유? MVVM의 요점은 데이터와 UI를 분리하는 것입니다. 단추로해야 할 일은 모두 DataBindings를 통해 수행 할 수 있습니다.

위 나던 작업을 시도하는 유일한 다른 점은 버튼에 X 줄 경우 : 키와 CommandParamter = {정적 리소스 'X : 키'}

+1

'Xamarin.Forms' 바인딩은 'RelativeSource' 속성도없고'RelativeSource' 마크 업 확장도 없습니다. –

+0

안녕하세요 @AlexAnderson ... 그래 두려운 일은 그 제안 중 어느 쪽도 효과가 없습니다. –

16

Xamarin.Forms은 그냥 않는 참조 태그 확장을 가지고 :

<Button x:Name="myButton" 
    Text="My Button" 
    Command="{Binding ButtonClickCommand}" 
    CommandParameter="{x:Reference myButton}"/> 

, 이것이 내가이 필요성을보고 있어요 처음이다, 당신은 아마 더 나은 ViewModels에서보기를 분리하고 깔끔한 패턴을 사용하여이 문제를 해결하거나 하지하여 명령을 공유 할 수 있지만 버튼을 가로 질러.

+0

안녕하세요 @StephaneDelcroix. 불행히도 그 중 하나가 작동하지 않았다 .. "호출의 대상에 의해 예외가 발생했습니다." –

+0

스택 추적을 공유 할 수 있습니까?xaml 2009 xmlns를 사용하고 있습니까? XF의 최신 버전 (1.2.2 또는 1.2.3-pre2)을 사용하고 있습니까? –

+0

죄송합니다 @ GavinSutherland,하지만 방금 1.2.3-pre-2에서 테스트했는데 예상대로 작동합니다. –