2012-08-23 101 views
0

我需要一些幫助來實現一些數據綁定。我的視圖模型公開以下屬性:WPF綁定棘手問題

public List<string> ChosenFeatures {get;set;} 
public Dictionary<string, double> AllFeatureCosts {get;set;} 

「ChosenFeatures」將包含目前在「AllFeatureCosts」字典鍵的子集。

在視圖中,我想渲染一系列TextBlocks,其中一個用於「ChosenFeatures」中的每個項目。以下是棘手的部分: - 每個TextBlock的Text屬性需要綁定到「AllFeatureCosts」字典中的值,並使用「ChosenFeatures」中的字符串作爲該字典項的關鍵字。

我將不勝感激任何有關如何編寫XAML來完成這一點的指針。

+1

爲什麼不把'ChosenFeatures'另一個'詞典<字符串,雙>',而不是隻攜帶了鑰匙嗎? – Jay

+0

@Jay AllFeatureCosts是用於驅動應用程序中各種視圖的單例,其值將不斷變化(由b/g線程更新)。我希望我能在XAML中做我需要的東西,但懷疑解決方案可能是討厭的或不可能的!相反,我想我可以讓viewmodel訂閱在AllFeatureCosts上更改事件並更新ChosenFeatures中的值(這將是您建議的字典)。 –

回答

0

爲數據提供一個ViewModel,這就是首先使用MVVM的原因。

class FeatureViewModel 
{ 
    public FeatureViewModel(MyViewModel aViewModel, string aKey) 
    { 
     mParent = aViewModel; 
     mKey = aKey 
    } 
    public string Value 
    { 
     get{return mParent.AllFeatureCosts[mKey];} 
    } 
} 

您的ViewModels添加集合到你的主視圖模型

public ObservableCollection<FeatureViewModel> Features{ get; set; } 

,從這裏也可以,如果有必要,如果你有INotifyPropertyChanged的正確實現地方初始化它

foreach(var feature in ChosenFeatures) 
{ 
    Features.Add(new VisualFeature(this, feature)); 
} 

,在FeatureViewModels上引發任何更改。你當然需要保持這些集合同步,這可能有點工作。

當然,你的DataTemplate需要藏漢

<DataTemplate DataType="{x:Type FeatureViewModel}"> 
    <TextBlock Text="{Binding Value}"/> 
</DataTemplate> 
0

首先的一些調整,我想你應該使用@周杰倫的做法,使ChosenFeatures字典也。

但是你可以使用Converter代替,並通過你的字典一樣的參數,同時結合:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
    var key = (string)value; 
    var dictionary = (Dictionary<string, double>)parameter; 

    if (dictionary.ContainsKey(key)) 
    return dictionary[key]; 
    else 
    return null; 
    } 
0

而是結合「ChosenFeatures」綁定「AllFeatureCosts」。我們知道它會顯示完整列表,然後我們可以編寫一個簡單的多重綁定可見性轉換器來顯示所選的項目(在ChosenFeatures中)。

注: 取決於它可能會影響應用程序性能的字典的大小...