2017-07-04 6 views
-1

私はWPFプロジェクト(MVVM Lightを使用しているMVVM)を持っていますが、コンバーターに情報を渡すマルチバインディングがあります。ActualWidthとActualHeightをマルチバインディングに渡す

そのためのコードはここにある:

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <Path Stroke = "{Binding LineColour}" > 
       <Path.Data> 
        < MultiBinding Converter="{StaticResource NodeToPathDataConverter}"> 
         <Binding Path = "NodeListViewModel.NodeList" Source="{StaticResource Locator}" /> 
         <Binding /> 
        </MultiBinding> 
       </Path.Data> 
      </Path> 
     </Grid> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

コンバータは、その行の詳細を吐き出すためにこれらのバインディングからの情報を使用しています。問題は、ラインがあるコントロールの(0,0)の位置から別のコントロールに移動することですが、問題のコントロールの中央から移動するようにしたいのです。これを行うには、MultiBindingのコンバーターは問題のコントロールのActualWidthとActualHeightを取得する必要があります。

問題のコントロールは何ですか?私は同じデータセットを使用するこの1つの下に、ほとんど同じListBoxコントロールを持っていますが、コントロール間に線を描画するのではなく、コントロール自体を描画します。

<ListBox.ItemTemplate> 
    <DataTemplate> 
      <Grid> 
       <Thumb Name = "myThumb" Template="{StaticResource NodeVisualTemplate}"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName = "DragDelta" > 
           < cmd:EventToCommand Command = "{Binding NodeListViewModel.DragDeltaCommand, Source={StaticResource Locator}}" PassEventArgsToCommand="True"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </Thumb> 
      </Grid> 
     </DataTemplate> 
</ListBox.ItemTemplate> 

私が2つのListBoxコントロールを使用したのは、すべての行がすべてのThumbsよりも低くなっていることを確認するためでした。私は同じリストボックスでそれらの多くの方法を試みたが、それは起こるつもりはなかった。彼らは同じデータセットを共有しますが、これは 'NodeList'です。

私が理解できないビットは、最初のListBoxのコンバータに2番目のListBoxのThumbのActualWidthとActualHeightを取得する方法です。それが私がここにいる理由です。

ご協力いただければ幸いです。

+0

親指を座標の中心に置く方が簡単かもしれません。固定サイズと固定(半分のサイズ)の負のマージンを持つ十分大きなグリッドの中央に配置することによって、 – Clemens

+0

幅広く、特に文脈がなくても(良い[mcve]のように)。つまり、あなたの文字通りの問題に対処するために、 'ListBox.ItemsSource'コレクションが両方とも同じソースにバインドされている場合、ビューモデルは、' Mode = OneWayToSource'を 'Actual ...'プロパティにバインドすることで仲介できます2番目のリストボックスと 'Mode = OneWay'を最初に使用します。おそらくここでのより良いアプローチは、最初の 'ListBox'を使わず、むしろアドバナーレイヤーのグラフィックスを置くことです。 2番目の 'ListBox'で使われているのと同じテンプレートからadornerにバインドできるはずです。 –

+0

確かにPeterですが、私は定期的に「あまりにも多くの情報」を提供していますので、私はどれだけ「十分な」ものかを把握しようとしています。私はここでもっとうまくいったと言っていますが、私は誰のように視認性に関心があります。 – TheFaithfulLearner

答えて

0

あなたがここで言及した回避策のいずれかを使用して、データオブジェクトの一部doubleソースプロパティに「バインド」第二ListViewThumbActualWidthActualHeight読み取り専用のプロパティを次のことができます。

Bind to ActualHeight of Item ItemsControl

を最初のListViewItemTemplateの同じソースプロパティにバインドできます。両方ともListViewsが同じソースコレクションにバインドされていれば、これはうまくいくはずです。

純粋なXAMLを使用して2番目のListViewの実際のThumb要素に直接バインドする方法はありません。

関連する問題