2012-01-06 45 views
4

我有一個靜態字典如何將(靜態)字典綁定到標籤?

class X { static Dictionary<string,string> MyDict {get { ... }} } 

本字典包含的數據,我想在一個網格控件顯示:

<Grid> 
    <!-- Row and Column-Definitions here --> 
    <Label Grid.Row="0" Grid.Column="0" Content="{Binding MyDict.Key=="foo" }" ToolTip="foo" /> 
    <!-- some more labels --> 
</Grid> 

1)我不知道如何訪問(在XAML)至字典

2.)我想綁定一個指定鍵的值到標籤的Content-Property。

該怎麼辦?

回答

3

您需要使用converter,這將允許您通過ConverterParameterDictionary中提取出您的值。

public class DictConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     Dictionary<string,string> data = (Dictionary<string,string>)value; 
     String parameter = (String)parameter; 
     return data[parameter]; 
    } 
} 

的XAML將如下...

<Window.Resources> 
    <converters:DictConverter x:Key="MyDictConverter"/> 
</Window.Resources> 

Content="{Binding MyDictProperty, Converter={StaticResource MyDictConverter}, ConverterParameter=foo}" 
+0

謝謝,問題已解決 – 0xDEADBEEF 2012-01-06 14:24:09

+3

這完全是過度的,因爲XAML解析器能夠使用索引器。 – Nuffin 2012-01-06 14:30:39

+0

@Tobias這並不過分,它是關注的分離。 – 2012-01-06 14:58:39

4

要訪問的字典,你必須做這樣的事情(如果你的DataContext是不是已經的X一個實例) :

<Grid> 
    <Grid.DataContext> 
     <X xmlns="clr-namespace:Your.Namespace" /> 
    </Grid.DataContext> 
    <!-- other code here --> 
</Grid> 

要訪問該值在字典中,你的綁定有如下所示:

<Label Content="{Binding MyDict[key]}" /> 
+0

'MyDict'是一個靜態的,這個綁定工作是否正確?擁有X的實例應該是不必要的。 – Lukazoid 2012-01-06 14:36:01

+0

您需要一個實例來告訴綁定引擎您的類的類型,否則它將無法知道在哪裏找到綁定目標。 – Nuffin 2012-01-06 14:41:00

+0

如果你可以看看我的答案,我認爲這應該達到預期的結果,而不實例化X的一個實例。 – Lukazoid 2012-01-06 14:51:50

0

我投了阿龍的轉換器和Tobias的索引,但實際訪問靜態辭典,嘗試在實例級別複製性和綁定到

// Code 
class X 
{ 
    protected static Dictionary<string,string> StaticDict { get { ... } } 
    public Dictionary<string, string> InstanceDict { get { return StaticDict; } } 
} 

// Xaml 
Content="{Binding InstanceDict, Converter = ... } " 
+0

這不是必需的,因爲只要數據上下文是需要的類型,就可以綁定到靜態和實例屬性。 – Nuffin 2012-01-06 14:39:40

+0

@Tobias,我沒有意識到這一點,感謝您的澄清 – 2012-01-06 14:45:31

4

你的綁定需要更改爲以下:

Content="{Binding Path=[foo], Source={x:Static local:X.MyDict}}" 

如果從MSDN看Binding Paths,你會看到字符串索引可以在XAML中指定。 local將是代表名稱空間的xmlns X駐留在。

+0

我可以問你幾個問題嗎?本地是什麼意思?我得到的錯誤命名空間前綴本地沒有定義和大X我認爲是ViewModel我有我的列表目前。 – 2014-06-09 18:18:18