2017-04-03 6 views
0

私は矩形が上記のItemsControlに宣言されているモデルにバインドされている以下の長方形mvvmのrectangle-commandにmultibindingを使用する方法は?

<Rectangle 
    Width="{Binding Width}" 
    Height="{Binding Length}" 
    Tag="{Binding Id}" 
    Name="rectangleDrawnMachine"> 

    <i:Interaction.Triggers> 
     <i:EventTrigger 
      EventName="MouseDown"> 
      <cmd:EventToCommand 
       Command="{Binding Main.UpdateSelectedMachine, Mode=OneWay, Source={StaticResource Locator}}" 
       PassEventArgsToCommand="True" 
       CommandParameter="{Binding ElementName=rectangleDrawnMachine}" /> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Rectangle> 

を得ました。矩形の少なくとも3つの特性を必要と-command

<Grid> 
    <ItemsControl ItemsSource="{Binding AllMachines}"> 
     <ItemsControl.ItemsPanel> 
      <ItemsPanelTemplate> 
       <Canvas Name="canvasDrawnMachines" /> 
      </ItemsPanelTemplate> 
     </ItemsControl.ItemsPanel> 

     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <Grid> 
        <Rectangle Name="rectangleDrawnMachine"/> 
       </Grid> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 
</Grid> 

今私UpdateSelectedMachine

  • 位置X
  • 位置y
  • ID /ドキュメント構造は、次のようなものですタグ

CommandParameter o f矩形そのものmyコマンドは、必要なタグのような長方形に関する多くの情報を取得します。しかし、それはキャンバスの(X-& Y-)位置についての必要な情報を得ることはありません。

私の質問は、どのように私の矩形コマンドにマルチバインディングを使用するのですか?どのようにキャンバスの位置を移すか?

答えて

1

コマンド・パラメータを使用して複数の値を渡すことはできません。

これを行うには、マルチバインディングを使用する必要があります。

<cmd:EventToCommand 
      Command="{Binding Main.UpdateSelectedMachine, Mode=OneWay, Source={StaticResource Locator}}" 
      PassEventArgsToCommand="True"> 
<cmd:EventToCommand.CommandParameter> 
<MultiBinding Converter="{StaticResource YourConverter}"> 
       <Binding Path="Canvas.Left" ElementName="canvasDrawnMachines"/> 
       <Binding Path="Canvas.Top" ElementName="canvasDrawnMachines"/> 
       <Binding Path="Tag" ElementName="canvasDrawnMachines"/> 
</MultiBinding> 
</cmd:EventToCommand.CommandParameter> 

あなたのコンバータ:

public class YourConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, ...) 
    { 
     return values.Clone(); 
    } 
} 

そして、実行コマンドロジック:あなたのサポートのための

public void OnExecute(object parameter) 
{ 
    var values = (object[])parameter; 
    var left = (double)values[0]; 
    var top = (double)values[1]; 
    var tag = values[2]; 
} 
+0

ありがとうございます。マルチバインディング方法は本当にうまく動作します。問題はキャンバスの四角形の位置が正しい値を転送しないことです。それは「定義されていない」と言います。多分私のデータ・テンプレートのために複数の矩形があるからでしょうか? – Chpo7234

+0

複数の矩形では問題ありません。あなたはあなたが好きなだけ多くを持つことができます。私は答えのバインディングを更新しました。 – Parag

+0

ありがとうございます。例: Canvas.Topは{DependencyProperty.UnsetValue}を返します。コード 'は問題なく動作します – Chpo7234

1

あなたは、このようなコマンドにコマンドパラメータとして渡しているRectangleCanvas.LeftCanvas.Top添付プロパティの値を取得することができます:あなたが位置を取得する方法を

double x = Canvas.GetLeft(rectangle); 
double y = Canvas.GetTop(rectangle); 

を知っていますかXAMLの方法で?

は、コンバータでMultiBindingを使用してCanvas.LeftCanvas.Topプロパティにバインドします

<MultiBinding Converter="{StaticResource converter}"> 
      <Binding Path="(Canvas.Left)" ElementName="canvasDrawnMachines"/> 
      <Binding Path="(Canvas.Top)" ElementName="canvasDrawnMachines"/> 
      <Binding Path="Tag" ElementName="canvasDrawnMachines"/> 
</MultiBinding> 
+0

感謝。しかし、私が望むのは、MVVMパターンでXAML上で行うことです。あなたはXAMLでポジションを取得する方法を知っていますか? – Chpo7234

+0

なぜ、Rectangleをパラメータとしてコマンドに渡していますか?私のポイントは、コマンドのExecuteメソッド内のRectangleの他のプロパティにアクセスするのと同じように、座標にアクセスできるため、実際に問題を理解できないことです。 – mm8

+1

マルチバインディングを使用している場合は、編集した回答ごとにCanvas.LeftプロパティとCanvas.Topプロパティにバインドする必要があります。つまり、プロパティは「Left」だけでなく「Canvas.Left」と呼ばれます。 – mm8

関連する問題