2014-01-20 6 views
1

У меня есть IMultiValueConverter под названием Placer, будучи использовать так:Как использовать MultiBinding много раз, в сокращенной форме, каждый с другим ConverterParameter?

<Rectangle Name="HostBox" Fill="#FFF4F4F5" Height="36" Stroke="Black" Canvas.Top="32" 
      Width="86" RadiusY="9.5" RadiusX="9.5"> 
    <Canvas.Left> 
     <MultiBinding Converter="{StaticResource Placer}" ConverterParameter="0.5"> 
      <Binding Path="ActualWidth" RelativeSource="{RelativeSource AncestorType={x:Type Canvas}}"/> 
      <Binding Path="Width" RelativeSource="{RelativeSource Self}"/> 
     </MultiBinding> 
    </Canvas.Left> 
</Rectangle> 

Но у меня есть много Rectangle с, на которые я хочу применить ту же логику, но с разной ConverterParameter значения. Должен ли я включать этот не очень маленький фрагмент под каждым RectangleCanvas.Left? (риторический вопрос ... очевидно, что есть более умный способ ... но как?)

+0

Только мысль, но это, возможно, возможно, будет гораздо проще реализовать [настраиваемую панель] (HTTP : //msdn.microsoft.com/en-us/library/ms754152.aspx#Panels_custom_panel_elements) со специальным поведением макета, как показано, например, в [этом ответе] (http://stackoverflow.com/a/21158560/1136211) , – Clemens

ответ

1

Попробуйте использовать стиль. Например, следующий один применяется для всех экземпляров прямоугольника, но вы могли бы также дать ему ключ и применить его индивидуально для ваших прямоугольников:

<Style TargetType="Rectangle"> 
     <Setter Property="Canvas.Left"> 
      <Setter.Value> 
       <MultiBinding Converter="{StaticResource Placer}" ConverterParameter="0.5"> 
        <Binding Path="ActualWidth" RelativeSource="{RelativeSource AncestorType={x:Type Canvas}}"/> 
        <Binding Path="Width" RelativeSource="{RelativeSource Self}"/> 
       </MultiBinding> 
      </Setter.Value> 
     </Setter> 
    </Style> 

Для параметрирования MultiBinding.ConverterParameter вы можете просто использовать привязку.

EDIT: Я исправлюсь о привязке к MultiBinding.ConverterParameter: это не представляется возможным, так как это не DependencyProperty но you can work around it.

+0

Но тогда я не могу изменить 'ConverterParameter' – Tar

+0

Как мне параметризовать' MultiBinding.ConverterParameter', который находится внутри 'Style', используя привязку в целевом' Rectangle'? – Tar

+0

Когда стиль применяется к элементу, привязки применяются к 'DataContext' этого элемента. Таким образом, вы можете привязываться к соответствующему средству View Model. – jnovo