2017-10-27 1 views
0

우리가 작성한 WPF 앱에서 일부 기능을 변경해야합니다. 우리는 MVVM 라이트를 사용하여 MVVM을 구현합니다. 메소드에 매개 변수를 전달해야 할 때마다 MVVM Light의 Messenger 클래스를 사용했습니다. 메서드에 3 개의 매개 변수를 전달해야하지만 Messenger 클래스를 사용하지 않고이 작업을 수행하려고했지만 대신 RelayCommand() 메서드를 사용하여 수행 할 수 있기를 바랍니다. 나는 몇 년 전부터 검색을했고, 여기에 this post을 찾았다. 그러나 적어도 저에게는 이것이 단지 하나의 유형을 사용하는 것처럼 작동하지 않을 것이라고 생각합니다. 이 경우 문자열. 몇 가지 실험을하고 내가 잘못한 거라고 실현 후, 나는 아마 내가 클래스의 속성으로 필요한 3 개 개의 값으로 클래스를 생성 모델 폴더에 넣어 사용할 수 결정여러 매개 변수로 RelayCommand를 호출하려면 어떻게해야합니까?

new RelayCommand<MyClass>() 

그래서 첫 번째 질문은, 그냥 내가 올바른 생각을 가지고 있는지 확인하기 위해, 나는 이런 식으로 뭔가를 할 것이라고 생각 :

new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C) 

올바른인가요?

위의 대답을 yes로 가정하면 XAML에서 바인딩 할 때 매개 변수를 실제로 전달하는 방법은 무엇입니까? 이 명령은 윈도우/페이지의 버튼과 관련이 있으므로 버튼의 Command 속성을 사용합니다. 어떻게하면 실제로 MyClass 인스턴스 Prop_A, Prop_B 및 Prop_C의 값을 전달합니까?

답변

1

, 첫 번째 질문, 그냥 내가 올바른 생각을 가지고 있는지 확인하기 위해, 나는 이런 식으로 뭔가를 할 것이라고 생각 :

new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C) 

이 올바른 것입니다. 내가 XAML에서 바인딩 할 때

그래, 그럼 어떻게 내가 실제로이에 매개 변수를 전달 않는 한 위의 답을 가정? 이 명령은 이 창/페이지의 단추와 연결되므로 Button의 Command 속성을 사용하여 이됩니다. 어떻게하면 실제로 MyClass 인스턴스 Prop_A, Prop_B 및 Prop_C에 대한 값을 전달합니까?

이것은 실제로 Prop_A, Prop_B 및 Prop_C의 출처에 달려 있습니다. 이러한 속성이 이미보기 모델 내에 있으면 XAML을 사용하여 매개 변수를 전달할 필요가 없습니다.

new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C) 

우리는 우리가 우리의 뷰 모델을로드 할 때, 우리는 우리가 필요로하는 모든 것을 가지고 있는지 확인해야합니다

new RelayCommand<object>((param) => 
{ 
    // param is not used. 
    var mc = this.MC; // assuming your view model holds the mc value 
    MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C); 
}); 

로 변경됩니다. 그렇지 않으면 IoC을 사용하여 필요한 모든 항목을 가져 오십시오. 나는 멀리 체재 할 것 9.

<Button Grid.Row="0" Grid.Column="1" Content="7" Command="{Binding PerformAction}" CommandParameter="7"/> 

- 당신의 명령에 매개 변수를 바인딩

당신이 당신의 명령, 0에있는 버튼 값을 전달하려는 계산기 응용 프로그램 같은 것을 종종 유용 보기에서 클래스를 정의합니다. 우려의 분리를 위해보기는 모델이 아닌 경계가 지정된 속성 만 알고 있어야합니다. 여기

<Button Content="Test" Style="{StaticResource contextMenuAware}" Command="{Binding MultiParameterCommand}"> 
    <Button.CommandParameter> 
     <MultiBinding Converter="{StaticResource MultiValueConverter}"> 
      <Binding Path="Items"/> 
      <!-- Pass more Bindings here or static values --> 
     </MultiBinding> 
    </Button.CommandParameter> 
</Button> 

는 컨버터의 포함을위한 코드입니다 :

class MultiValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     foreach (var item in values) 
     { 
      //process the properties passed in and you will need to unbox those parameters 
     } 
     return new object(); 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 

을 그리고 XAML에서 (버튼 코드) :

1

그래서, 첫 번째 질문, 그냥 내가 올바른 생각을 가지고 있는지 확인하기 위해, 나는 이런 식으로 뭔가를 할 것이라고 생각 :

new RelayCommand<MyClass>((mc) => MyMethod(mc.Prop_A, mc.Prop_B, mc.Prop_C) 

올바른인가요?

예, 그렇습니다.

어떻게 MyClass 인스턴스 Prop_A, Prop_B 및 Prop_C의 값을 실제로 전달합니까?

단순히 명령 매개 변수로 XAML 내부의 매개 변수를 보유하고있는 클래스의 인스턴스를 만들 :

그래서
<Button Command="{Binding Command}"> 
    <Button.CommandParameter> 
     <local:MyClass Prop_A="a value" Prop_B="b value" Prop_C="c value" /> 
    </Button.CommandParameter> 
</Button> 
1

다른 IMultiValueConverter를 사용하여이 작업을 수행 할 수있는 방법이있다

xmlns:converter="clr-namespace:SO_app.Converters" 

그리고 나서 창 리소스 태그 :

,
<converter:MultiValueConverter x:Key="MultiValueConverter"/> 



DependencyProperties을 구현하지 않고 매개 변수를 전달 할 때 바인딩 사용할 수있는이 방법. 여기

1

내가 그것을 어떻게 있습니다 :

  1. 귀하의 CommandRelay 객체를 사용하면 다음 [] 자신의 객체에 대한 각 요소를 객체 해당 개체를 변환 매개 변수로 객체를합니다.

    개인 RelayCommand _YourCommand; 공공 RelayCommand YourCommand { 다음 {

    return _YourCommand 
         ?? (_YourCommand = new RelayCommand<object>(
               p => 
               { 
                var values = (object[]) p; 
                int item1 = int.Parse(values[0].ToString()); 
                string item2 = values[1].ToString(); 
                double item3 = double.Parse(values[2].ToString()); 
    
               })); 
    } 
    

    }

  2. 를 얻을 XAML에서

(물론, 바인딩에 경로는 바인더 제본 개체에 대한 유효한 참조를해야합니다)

<Button Command="{Binding YourCommand}"> 
 
    \t <Button.CommandParameter> 
 
    \t  <MultiBinding> 
 
    \t   <Binding Path="Item1"/> 
 
    \t   <Binding Path="Item2"/> 
 
    \t   <Binding Path="Item3"/> 
 
    \t  </MultiBinding> 
 
    \t </Button.CommandParameter> 
 
</Button>

관련 문제