2010-04-17 9 views
2

J'ai un problème avec un MultiBinding:L'accès aux données liées à IMultiValueConverter.ConvertBack() en C#/WPF

<Canvas> 
<local:SPoint x:Name="sp" Width="10" Height="10"> 
    <Canvas.Left><!-- irrelevant binding here --></Canvas.Left> 
    <Canvas.Top> 
    <MultiBinding Converter="{StaticResource myConverter}" Mode="TwoWay"> 
    <Binding ElementName="cp1" Path="(Canvas.Top)"/> 
    <Binding ElementName="cp1" Path="Height"/> 
    <Binding ElementName="cp2" Path="(Canvas.Top)"/> 
    <Binding ElementName="cp2" Path="Height"/> 
    <Binding ElementName="sp" Path="Height"/> 
    <Binding ElementName="sp" Path="Slope" Mode="TwoWay"/> 
    </MultiBinding> 
    </Canvas.Top> 
</local:SPoint> 
<local:CPoint x:Name="cp1" Width="10" Height="10" Canvas.Left="20" Canvas.Top="150"/> 
<local:CPoint x:Name="cp2" Width="10" Height="10" Canvas.Left="100" Canvas.Top="20"/> 
</Canvas> 

Pour calculer la valeur Canvas.Top, monconvertisseur a besoin de toutes les valeurs liées. Cela fonctionne très bien dans Convert(). Dans l'autre sens, myConverter devrait idéalement calculer la valeur de Slope (Binding.DoNothing pour le reste), mais il a besoin des autres valeurs en plus de Canvas.Top un passé à ConvertBack(). Quelle est la bonne façon de résoudre cela?

J'ai essayé de créer la liaison OneWay et de créer une liaison multiple supplémentaire pour le SPoint.Slope local, mais cela provoque une récurrence infinie et un débordement de pile. Je pensais que le ConverterParameter pourrait être utilisé, mais il semble que ce ne soit pas possible de s'y lier.

Répondre

3

L'approche n'est peut-être pas la plus élégante, mais elle contourne les limites des multi-liaisons et le fait que ConverterParameter n'est pas un DependencyProperty.

Faites votre convertisseur dériver de FrameworkContentElement. Définir un certain nombre de propriétés DependencyProperty. Vous en aurez besoin d'autant qu'il y a des valeurs dont vous avez besoin aux deux extrémités de la conversion.

Depuis votre convertisseur se trouve normalement dans les ressources XAML, DataContext et ElementName fixations ne fonctionneront pas sans l'aide de DataContextSpy et/ou ElementSpy, en fonction de vos besoins particuliers de liaison. La bizarrerie de cette approche est que vous aurez deux liaisons identiques, l'une dans la section <MultiBinding> de XAML et l'autre dans Resources où vous définissez votre convertisseur. Le premier est nécessaire pour déclencher le MultiBinding tandis que le dernier fournit réellement la valeur dans la direction ConvertBack. Un inconvénient est que les ressources sont partagées et donc si vous avez besoin du même convertisseur fonctionnel ailleurs sur la page, vous devrez peut-être en déclarer un second dans vos ressources. C'est seulement si deux MultiBinding ont besoin de paramètres différents. Si les paramètres sont partagés, vous pouvez également utiliser la même ressource. Vous pouvez également essayer x:Shared="False" sur la ressource du convertisseur, mais je ne suis pas sûr que cela fonctionnerait.

+1

Merci, c'est très perspicace. Cela me rappelle aussi que lorsque les choses se compliquent, le problème pourrait être la conception. :) Je vais peut-être reconsidérer mon approche. – absence

Questions connexes