2015-05-13 84 views
1

我有一個WPF控制窗格與十六個相同的子控件包含一個組合框,需要綁定到父控制代碼後面的列表。我真的很努力讓這個列表綁定,直到我發現這個:Binding objects defined in code-behind從繼承的數據上下文綁定到屬性

父控件上的設置DataContext="{Binding RelativeSource={RelativeSource Self}}"允許我直接綁定子控件上的組合框。

問題是,現在我想創建一個數據模板來正確顯示列表項,但沒有任何我放在綁定或相對源顯示任何東西。

ControlPane.xaml

<UserControl 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     x:Class="ControlPane" 
     x:Name="CtrlPaneWpf" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     > 

ControlPane.xaml.cs

public class TwoStringClass 
{ 
    public string string1; 
    public string colorHex; 
} 

public ObservableCollection<TwoStringClass> TwoStringClass1 
{ 
    get 
    { 
     ObservableCollection<TwoStringClass> cmbclrs = new ObservableCollection<TwoStringClass>(); 
     cmbclrs.Add(new TwoStringClass() { string1 = "This", colorHex = "#FF0000" }); 
     cmbclrs.Add(new TwoStringClass() { string1 = "That", colorHex = "#FF352E2" }); 
     cmbclrs.Add(new TwoStringClass() { string1 = "The Other", colorHex = "#FFF4F612" }); 
     return cmbclrs; 
    }  
} 

ChildControl.xaml

<UserControl 
      x:Name="ChildControl" 
      > 
      <ComboBox x:Name="cmbFontColor" ItemsSource="{Binding TwoStringClass1}" > 
       <ComboBox.ItemTemplate> 
        <DataTemplate> 
         <StackPanel> 
          <TextBlock Text="{Binding string1}" /> 
          <Rectangle Fill="{Binding colorHex}" /> 
         </StackPanel> 
        </DataTemplate> 
       </ComboBox.ItemTemplate> 
      </ComboBox> 
</UserControl> 

我知道綁定正在工作,因爲我在Combobox中獲得了正確數量的(空白)項目,並且如果刪除ItemTemplate,可以看到類名稱。

我無法弄清楚爲什麼綁定到屬性名稱時不能正常工作,因爲當列表來自控件自己的代碼時。

必須有一些其他信息需要添加到TextBlock綁定中,但無論我嘗試使用什麼DataContext或RelativeSource,我總是會獲得空白項目。

回答

1

WPF中的數據綁定僅適用於公共屬性,不適用於字段。你的項目類應該是這樣的:

public class TwoStringClass 
{ 
    public string string1 { get; set; } 
    public string colorHex { get; set; } 
} 

這就是說,有被廣泛接受的命名規則,根據該你應該使用Pascal case的屬性名稱,例如String1ColorHex

+1

這樣做。非常感謝你。現在關閉重命名我的所有屬性... –

0

我相信你的問題的答案與我最近發佈的問題的答案相同,由StewBob回答。這是我的答案略有修改的版本,它也應該解決您遇到的問題。

你可以看到我原來的線程在這裏:WPF ListBox with CheckBox data template - Binding Content property of Checkbox not working

我看你補充說:「這個」,「那個」,和「他者」作爲數據源,據推測爲簡單起見,張貼這個問題SO。請注意,如果您的真正底層數據源可能發生變化,那麼在進行DataBinding時,您的類需要實現INotifyPropertyChanged以使數據在UI中正確顯示。一個例子:

public class TwoStringClass: INotifyPropertyChanged 
{ 

    private string _String1; 
    private string _ColorHex; 

    public string String1 
    { 
    get 
    { 
     return _String1; 
    } 
    set 
    { 
     if (value != _String1) 
     { 
     _String1 = value; 
     NotifyPropertyChanged("String1"); 
     } 
    } 
    } 

    public string ColorHex 
    { 
    get 
    { 
     return _ColorHex; 
    } 
    set 
    { 
     if (value != _ColorHex) 
     { 
     _ColorHex = value; 
     NotifyPropertyChanged("ColorHex"); 
     } 
    } 
    } 

    private void NotifyPropertyChanged(string info) 
    { 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this, new PropertyChangedEventArgs(info)); 
    } 
    } 

    public event PropertyChangedEventHandler PropertyChanged; 
} 

這顯示了類,兩個屬性,以及用於實現INotifyPropertyChanged的所需事件和方法。

+0

只供您參考。只有當綁定的源屬性更改其值時,需要更新潛在綁定時,才需要實現INotifyPropertyChanged。只要這沒有必要(這似乎是在這個問題的情況下),它是完全有效的不執行此接口。綁定本身運行良好,沒有任何更改通知。因此,您的陳述「您的課程需要實施INotifyPropertyChanged才能在UI中正確顯示數據」不正確。不實現接口絕不是「一個bug」。 – Clemens

+0

如我的評論中所示,該bug評論是針對底層數據發生變化的情況。原始海報在他的問題中添加了字符串「This」,「That」和「The Other」,這可能是爲了將此問題發佈到SO而簡化的數據。有人絆倒了這一點,並實現了這個解決方案,但沒有看到任何僅適用於靜態數據源的參考,它將遇到一個錯誤,而一個答案調用差異以及您需要iNotifyPropertyChanged的原因不會導致錯誤(在應用程序中)。 – Bobby