0

それぞれがスタック パネルに画像とテキストを含む 3 つの ComboBoxItems を持つ ComboBox があります。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: viewmodel を使用して MVVM を見てみましょう。これらのタスクをバインドするのは非常に簡単です。

于 2012-06-15T13:31:18.410 に答える