A volte una domanda a prima vista banale in realtà si rileva più complicata del previsto, nello specifico la domanda era: Come posso recuperare un controllo all'interno di un mio custom ValueConverter?.
La prima risposta è stata quella di passare un riferimento all'elemento host attraverso ConverterParameter e poi usare il metodo FindName : ovvero usare qualcosa tipo:

<Window.Resources>
 <local:MyMultiValueConverter x:Key="mc" />
</Window.Resources>
...
<TextBox Text="{Binding Path=Title, Converter={StaticResource mc},

      
 ConverterParameter={Binding ElementName=win1}}"
>

...purtroppo non funziona in quanto Binding funziona solo con delle proprietà che sono delle DependencyProperties.
Dopo una lunga serie di test alla fine la soluzione: Usare un MultiBinding!

<Window.Resources>
 <local:MyMultiValueConverter x:Key="mc" />
</Window.Resources>
...
<TextBox Height="21" Margin="79,87,79,0" Name="textBox1" VerticalAlignment="Top">
 <TextBox.Text>
 <MultiBinding Converter="{StaticResource mc}" Mode="OneWay">
 <Binding ElementName="win1" Path="."/>
 <Binding ElementName="win1" Path="Title"/>
 </MultiBinding>
 </TextBox.Text>
</TextBox>
 
 public class MyMultiValueConverter : IMultiValueConverter
 {
 public object Convert (object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
 {
 Window win = values[0] as Window;
 Button btn = win.FindName("button1") as Button;
 string title=values[1].ToString();
 if (btn == null)
 return title;
 else
 return btn.Content.ToString() + " " + title; 
 }
 
 public object[] ConvertBack (object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
 {
 throw new NotImplementedException();
 } 
 }

In pratica si tratta di passare l'oggetto "host" come uno dei parametri da usare per la conversione, ovviamente bisogna fare attenzione all'ordine dei parametri però si ha il vantaggio di non avere limitazioni nel numero di informazioni da passare al converter.

Per la serie: "Buono a sapersi" abbiamo trasmesso....

Technorati Tags: , ,