我有一个ComboBoxwith 3个ComboBoxItems,每个包含一个堆栈面板中的图像和文本。 我想将SelectedValue绑定到TextBlock文本,但不能只绑定到内容,因为这将返回堆栈面板。如何将SelectedValue绑定到子TextBlock控件?我不需要通知任何其他我只需要SelectedValue来返回字符串。
<ComboBox>
<ComboBoxItem>
<StackPanel Orientation="Horizontal">
<Image Source="ImagePath/Image.bmp"/>
<TextBlock Text="MyTextString"/>
</StackPanel>
</ComboBoxItem>
</ComboBox>
答案 0 :(得分:1)
SelectedValue实际上是与绑定相关的属性。在您的情况下,您正在静态创建组合框项目。
检查这个
在您的情况下,您可以在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,绑定这些任务很容易实现