2017-03-23 17 views
1

明確でない場合は、私の質問を修正してください。私が探している...ここでWPF x:名前をキーとして辞書へのバインド

は...それが動作辞書のバインディングのサンプルですされています。あなたが見

<TextBlock x:Name="Id" Text="{Binding Path=MyDictionary[x:Name]}" /> 

<TextBlock Text="{Binding Path=MyDictionary[ThisIsKeyInMyDict]}" /> 

私が探していますか?私は、このコントロールの "名前"と同じキーの辞書を探したいと思っています。

ありがとうございました!

+0

あなたは 'テキスト= "{バインディングパス= MyDictionary [X :名]}"'を試したことがありますか?コロンは特殊文字であり、エスケープする必要があります。 –

+0

私のコードの臭いの感覚はうずきがあります...これはX/Yの問題です。あなたは目標を持っていますが、使用しようとしている方法は推奨パターンよりも使いにくい/難しいです。辞書に対するバインディングはコードの匂いの一部です(笑、plsはありません)。あなたが何をしようとしているのかを明確に記述しておけば、おそらくもっと良い答えが得られるはずです。そして、あなたがしようとしているもの([mcve](http://stackoverflow.com/help/mcve))を実証している、絶対に剥げたベアボーンのプロトタイプアプリケーションを作成すると、最高の答えが得られます。 – Will

+0

@ウィルス提案をありがとう!私はここで少し複雑な質問をしました:http://stackoverflow.com/q/43006104/7727517この質問の範囲は、ここで詳細を追加するために狭められました。 –

答えて

1

あなたはそれのためにMultiBindingのを使用することができます。

<Window.Resources> 
     <local:DictValueConverter x:Key="dictValCnv"/>   
    </Window.Resources> 
<TextBlock.Text> 
    <MultiBinding Converter="{StaticResource dictValCnv}"> 
     <Binding Path="MyDictionary"/> 
     <Binding RelativeSource="{RelativeSource Self}" Path="Name"/> 
    </MultiBinding> 
</TextBlock.Text> 


using System; 
using System.Globalization; 
using System.Linq; 
using System.Windows.Data; 
public class DictValueConverter : IMultiValueConverter 
{ 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) 
    { 
     if (values==null || values.Length<2) 
     { 
      return false; 
     } 

     var dict = values[0] as IDictionary; 
     if(dict.Contains(values[1])) 
    { 
     return dict[values[1]]; 
    } 
     return "KeyNotFound"; 
    } 
    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) 
    { 
     throw new NotImplementedException(); 
    } 
} 
関連する問題