2012-06-15 57 views
0

我有一個ComboBoxwith 3 ComboBoxItems,每個ComboBoxItems都包含一個圖像和一個堆棧面板中的文本。 我想將SelectedValue綁定到TextBlock文本,但不能僅僅綁定到內容,因爲這會返回堆棧面板。如何將SelectedValue綁定到子TextBlock控件?我不需要通知任何其他我只需要SelectedValue返回字符串。當Content不僅僅是一個字符串時綁定到ComboBoxItem內容WPF

<ComboBox> 
    <ComboBoxItem> 
    <StackPanel Orientation="Horizontal"> 
     <Image Source="ImagePath/Image.bmp"/> 
     <TextBlock Text="MyTextString"/> 
    </StackPanel> 
    </ComboBoxItem> 
</ComboBox> 

回答

1

SelectedValue實際上是與綁定相關的屬性。在你的情況下,你正在靜態創建組合框項目。

檢查這個

http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvaluepath.aspx

你的情況,你可以在代碼上ComboBoxItem

<ComboBox Height="40" x:Name="cmb" SelectedValuePath=""> 
      <ComboBoxItem Tag="MyTextString"> 
       <StackPanel Orientation="Horizontal" > 
        <Image Source="ImagePath/Image.bmp"/> 
        <TextBlock Text="MyTextString"/> 
       </StackPanel> 
      </ComboBoxItem> 
     </ComboBox> 

和訪問它添加標記屬性

MessageBox.Show((cmb.SelectedItem as ComboBoxItem).Tag.ToString()); 
+0

謝謝,這很簡單,完美的作品,只是我想找的東西。我可以看到標籤在未來也會有用。 – DanBrum

1

一個簡單的方法是把你的cooboboxitem信息放在一個包裝中把這些包裝的集合作爲你的組合框的itemssource。

public ObservableCollection<MyComboboxData> MyData { get; private set; } 

    public MyViewWithCombobox() 
    { 
     InitializeComponent(); 

     this.MyData = new ObservableCollection<MyComboboxData>() 
          { 
           new MyComboboxData(){MyImagePath = "ImagePath/Image.bmp", MyText = "MyTextString"}, 
           new MyComboboxData(){MyImagePath = "ImagePath/Image2.bmp", MyText = "MyTextString2"} 
          }; 

     this.DataContext = this; 
    } 

現在你可以簡單地綁定到所有你想要的東西:

<Grid> 
    <ComboBox Name="comboBox1" ItemsSource="{Binding MyData}"> 
     <ComboBox.ItemTemplate> 
      <DataTemplate> 
       <StackPanel Orientation="Horizontal"> 
        <Image Source="{Binding ImagePath}"/> 
        <TextBlock Text="{Binding MyText}"/> 
       </StackPanel> 
      </DataTemplate> 
     </ComboBox.ItemTemplate> 
    </ComboBox> 
    <TextBlock Text="{Binding ElementName=comboBox1, Path=SelectedItem.MyText}"/> 
</Grid> 

PS:

public class MyComboboxData 
{ 
    public string MyImagePath { get; set; } 
    public string MyText { get; set; } 
} 
在你的代碼隱藏

看看MVVM與視圖模型,並結合這些任務很容易實現

+0

感謝您的回覆,我可以看到爲什麼這會起作用。我是WPF的新手,發現它有一個陡峭的學習曲線,但卻掌握了它。我一直在其他情況下使用MVVM,但還沒有以這種方式使用它,但現在很明顯,雖然我認爲這可能是更好的編程實踐,而不是我在下面通常用來將數據與UI分開的方法,然而,這個對話框是針對一個非常特殊的情況,因此在這種情況下靜態地創建組合框項目是有意義的。 – DanBrum

+0

只要你不想單元測試,你可以去其他 - 不是那麼mvvm的方式;) – blindmeis

相關問題