当Content不仅仅是字符串WPF时绑定到ComboBoxItem内容

时间:2012-06-15 13:10:06

标签: wpf binding combobox

我有一个ComboBoxwith 3个ComboBoxItems,每个包含一个堆栈面板中的图像和文本。 我想将SelectedValue绑定到TextBlock文本,但不能只绑定到内容,因为这将返回堆栈面板。如何将SelectedValue绑定到子TextBlock控件?我不需要通知任何其他我只需要SelectedValue来返回字符串。

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

2 个答案:

答案 0 :(得分:1)

SelectedValue实际上是与绑定相关的属性。在您的情况下,您正在静态创建组合框项目。

检查这个

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

在您的情况下,您可以在ComboBoxItem上添加Tag属性

<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());

答案 1 :(得分:1)

一种简单的方法是将您的coboboxitem信息保存在包装器中,并将这些包装器的集合作为组合框的项目源。

public class MyComboboxData
{
    public string MyImagePath { get; set; }
    public string MyText { get; set; }
}
你的代码隐藏中的

    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:看看带有viewmodel的MVVM,绑定这些任务很容易实现