2017-04-26 16 views
1

私はXamarinでバインドしようとしているDictionary<Tuple<SomeEnum, double, string>, double>を持っています。私は値(ダブル)をラベルにバインドしようとしています。私が持っている問題は、タプルキーにバインドするパス構文を理解できないことです。私はDictionary<string, double>と私はちょうどPath="[" + keyString + "]"を聞かせて、知っているが、私はキーとしてタプルを使用する場合は何をするか分からない。それはあなたがコンマ(、)で区切られた複数のインデクサのパラメータを持つことができますインデクサインサイドC#のタプルキーで辞書へのデータバインディング

ことに注意しないが、でもMicrosoft's page on data binding path syntax in C#は、明示的にこのケースを処理していないようです。各パラメーターのタイプは、かっこで指定することができます。たとえば、Path="[(sys:Int32)42,(sys:Int32)24]"を持つことができます。sysは、System名前空間にマップされます。

ここでは、これは単一のインデクサーオブジェクトにも当てはまると思います。だから私の辞書のケースでは、私はPath="[(sys:Tuple<SomeEnum, sys:double, sys:string>)???]"のようなものを持っていると思うが、私は???がどこに行くのか分からない。 SomeEnumの前に名前空間が必要かどうかはわかりません。そして最後に、私はそれ以上の詳細な文書を見つけることができません。だから、私はこれらの面のいずれかに助けを借りるつもりです。

最後に、私はちょうどあきらめて、Dictionary<string, double>に切り替えて、その文字列をタプルのタイプの.ToString()の連結にする必要があるかもしれないと恐れています。各キーをstring key = SomeEnum.SomeValue + "," + someDouble + "," + someStringとすることで、これを正しく行うことができます。私はタプルを別の非文字列型に変更するのにはオープンですが、それが役に立ちます。おそらく他の不変の型ですか?私はC#のデータバインディングには基本を超えて熟練しているわけではないので、どんな助けやアイデアも高く評価されています。

+0

これは、あなたの質問に答えるかもしれませんします。http:// stackoverflow.com/a/43209056/880990 –

+0

ありがとうOlivier、それは新しいC#7の価値ですタプルタイプ。私はバインド可能な古いC#6タプル型を使用しています。例えば、 https://msdn.microsoft.com/en-us/library/dd386940(v=vs.110).aspx。あなたが投稿した質問が私を助けることができるかどうかは分かりません。 – TheIntern

答えて

1

実際、マルチインデクサはデータバインディングでサポートされています。構文は以下の通りです:

<object Path="[index1,index2...]" .../> 
or 
<object Path="propertyName[index,index2...]" .../> 

からPropertyPath XAML Syntax

しかし、XAMLパス内Tupleを作成することは非常に難しいことができます。

  1. Tuple
  2. が最も簡単かつきれいな、おそらく溶液#2であるマルチインデクサ

をサポートして辞書を作成し生成するために、カスタムマークアップ拡張機能を作成します。これに2つのソリューションがあります。 (PathToDictionary[{ns:Tuple a,b,c}]PathToDictionary[a,b,c])。使い方の

public class TripleKeyedDictionary<TKey1, TKey2, TKey3, TValue> : Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue> 
{ 
    public TValue this [TKey1 key1, TKey2 key2, TKey3 key3] 
    { 
     get { return this[Tuple.Create(key1, key2, key3)]; } 
     set { this[Tuple.Create(key1, key2, key3)] = value; } 
    } 
} 

例:LINQPad用PathToDictionary[Banana,b,c]

全例:辞書として


使用これを

void Main() 
{ 
    var data = new 
    { 
     Lookup = new TripleKeyedDictionary<Fruit, string, string, string> 
     { 
      { Tuple.Create(Fruit.Banana, "b", "c"), "value" } 
     } 
    }; 

    var binding = new Binding("Lookup[Banana,b,c]"); 
    binding.Mode = BindingMode.OneWay; 
    binding.Source = data; 
    binding.FallbackValue = "fallback"; 
    binding.TargetNullValue = "null"; 

    var block = new TextBlock().Dump(); 
    block.SetBinding(TextBlock.TextProperty, binding); 
} 

// Define other methods and classes here 
public enum Fruit 
{ 
    Apple, Banana, Cactus 
} 
public class TripleKeyedDictionary<TKey1, TKey2, TKey3, TValue> : Dictionary<Tuple<TKey1, TKey2, TKey3>, TValue> 
{ 
    public TValue this [TKey1 key1, TKey2 key2, TKey3 key3] 
    { 
     get { return this[Tuple.Create(key1, key2, key3)]; } 
     set { this[Tuple.Create(key1, key2, key3)] = value; } 
    } 
} 
+0

非常にエレガントな代替ソリューション。ありがとう! – TheIntern