2009-12-09 74 views
0

我對數據綁定非常陌生,到目前爲止只有幸運數據綁定到GUI中的元素屬性,或綁定到ObservableCollection以顯示數據列表。現在我想做一些不同的事情。數據綁定到非UI元素

我有需要的索引,並返回雙打的名單我有當用戶從下拉框選擇指數GUI,然後幾個文本框需要有自己的文本的方法,即

List<double> GetValues(int index); 

用列表中的值更新。我實際上有一個線程運行緩存所有這些數據,因爲我在不同的地方使用了UI元素,它們會消耗和顯示相同的信息。所以我想,爲什麼不使用數據綁定?問題是,我還沒有找到一個很好的在線示例,它解釋瞭如何從組合框中獲取索引,調用GetValues方法,然後將結果信息綁定到所有文本框 - 全部來自XAML。

我找到的最近的文章是http://msdn.microsoft.com/en-us/magazine/cc163299.aspx。我讀過的大部分文章都談到了使用Source屬性,但接下來說,「最簡單的方法就是使用StaticResource,所以我們會告訴你這種方法。」

這是如何實現的?最好回到完全由代碼隱藏完成這個簡單的方法嗎?

回答

2

您遇到的問題是您試圖綁定到函數的結果,並且您可能會通過試圖在代碼隱藏的簡單代碼上實現數據綁定而使事情複雜化。我建議從代碼隱藏中做到這一點。

這就是說,對於最簡單和最有用的方法,您需要在類中綁定到實際屬性,而在索引更改時需要更新這些屬性。根據你傳遞數據的方式,這可以減少代碼隱藏,或者只是創建更多。

這裏是你可以用到底是什麼了一個例子:

// Assume 1 of your textboxes displays a weight. Here's the property declaration: 
// Disclaimer: Not compiled or tested at all. 
public static readonly DependencyProperty WeightProperty = DependencyProperty.Register(
    "Weight", typeof(double), typeof(MyClass), new PropertyMetadata(0.0)); 

public double Weight 
{ 
    get { return (double)this.GetValue(WeightProperty); } 
    set { this.SetValue(WeightProperty); } 
} 

// Here's an example of setting the property: 
private void ComboBoxSelectedIndexChanged(object sender, RoutedEventArgs e) 
{ 
    List<double> values = myObject.GetValues(comboBox.SelectedIndex); 
    this.Weight = values[0]; 
} 

// And in your XAML, assuming you've given your Window the name myWindow: 
<TextBlock Text="{Binding ElementName=myWindow, Path=Weight}"/> 

如果你打算更新在多個地方Weight屬性,並希望將TextBlock始終顯示正確的值這可能是有用的。

在另一方面,如果你的屬性將在SelectedIndexChanged功能僅更新,你不需要該功能以外的值,你可能也剛剛爲自己設定的值,並減少不必要的開銷:

private void ComboBoxSelectedIndexChanged(object sender, RoutedEventArgs e) 
{ 
    List<double> values = myObject.GetValues(comboBox.SelectedIndex); 
    txtWeight.Text = values[0].ToString(); 
} 
+0

感謝您的優秀建議!我最終可能會使用混合解決方案,即我將創建一個具有必要的依賴屬性的類,並且此類中的值將通過組合框selectchanged事件處理程序在代碼隱藏中更改。然後我將使用數據綁定來訪問值。我還沒有看到這種方法對於我的GUI的其他部分是否有意義。 – Dave

+0

請問我還有其他一些問題 - 一切都很好,但現在我又添加了兩個我需要綁定的對象。它們與我以前使用的類型相同(當然,它是從DependencyObject派生的)。如何指定我想要的源?我嘗試使用綁定的Source屬性,即 Text =「{Binding Source = _my_object,Path = MyValue}」 但是它編譯不起作用 - 文本只是空白。我究竟做錯了什麼? – Dave

+0

在代碼中設置源並僅設置綁定中的路徑。 XAML中的「{Binding Path = MyValue}」和'myTextBlock。來源= myObject;'在C# –