0

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

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

2 回答 2

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());
于 2012-06-15T13:22:05.677 回答
1

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

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: 看看MVVM with viewmodel and binding这些任务很容易实现

于 2012-06-15T13:31:18.410 回答