none
求教各位大神,如何获取comboBox里面的selectItem里面的textblock里面的text呢 RRS feed

  • 问题

  • 我的ComboBox子里面是textblock,要如何获取selectItem里面的textblock里面的字体呢

    子item样式如下

     <DataTemplate x:Key="ctComBoBoxDataTemp">
                   <Grid>
                        <Canvas Height="20"  Background="White">
                            <TextBlock Text="{Binding UserName}" Foreground="Black"/>
                        </Canvas>
                    </Grid>
            </DataTemplate>

    comboBox样式如下:

            <ComboBox x:Name="mctComboBox"
                      ItemsSource="{Binding Source={StaticResource ctComBoBoxViewSource}}" 
                      HorizontalAlignment="Left"  ItemTemplate="{StaticResource ctComBoBoxDataTemp}"
                      Margin="482,329,0,0" VerticalAlignment="Top" Width="333" Height="42"
                      SelectionChanged="mctComboBox_SelectionChanged">
            </ComboBox>

    我这样做,却无法获取得到textblock,转换失败,显示不支持此接口

    Windows::UI::Xaml::Controls::TextBlock^ tb=ref new Windows::UI::Xaml::Controls::TextBlock;
    	tb=safe_cast<Windows::UI::Xaml::Controls::TextBlock^>( mctComboBox->SelectedItem);
    	String^ a= tb->Text;

    2013年12月11日 2:27

答案

  • Hi pingglala,

    这是正常的,请看你的DataTemplate中,首先是Grid,然后是Canvas,最后才是TextBlock,如果直接转换成TextBlock的话必然有问题。

    请参考我之前帖子中回复你的代码,你可以用var这样的通配类型来表示你的Object,C++中是auto,后台代码如下,C++也是类似的写法,你自己重写一下,如果有问题的话再继续讨论:

            bool fst = true;
            //TextBlock temp;
            private void selectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (fst)
                {
                    fst = false;
                    ItemCollection t = cob.Items;
                    var tmp = cob.SelectedItem;
                    t.Remove(tmp);
                    t.Insert(0, tmp);
                    fst = false;
                    cob.SelectedItem = tmp;  
                }
                else
                {
                    fst = true;
                } 
            }
    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    • 已标记为答案 pingglala 2013年12月11日 8:48
    2013年12月11日 7:43
    版主

全部回复

  • 期待各大神的回复~
    2013年12月11日 2:27
  • Hi pingglala,

    这是正常的,请看你的DataTemplate中,首先是Grid,然后是Canvas,最后才是TextBlock,如果直接转换成TextBlock的话必然有问题。

    请参考我之前帖子中回复你的代码,你可以用var这样的通配类型来表示你的Object,C++中是auto,后台代码如下,C++也是类似的写法,你自己重写一下,如果有问题的话再继续讨论:

            bool fst = true;
            //TextBlock temp;
            private void selectionChanged(object sender, SelectionChangedEventArgs e)
            {
                if (fst)
                {
                    fst = false;
                    ItemCollection t = cob.Items;
                    var tmp = cob.SelectedItem;
                    t.Remove(tmp);
                    t.Insert(0, tmp);
                    fst = false;
                    cob.SelectedItem = tmp;  
                }
                else
                {
                    fst = true;
                } 
            }
    --James


    <THE CONTENT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, WHETHER EXPRESS OR IMPLIED>
    Thanks
    MSDN Community Support

    Please remember to "Mark as Answer" the responses that resolved your issue. It is a common way to recognize those who have helped you, and makes it easier for other visitors to find the resolution later.

    • 已标记为答案 pingglala 2013年12月11日 8:48
    2013年12月11日 7:43
    版主
  • 版主好,受版主启发,已经找到解决方法,是直接将mctComboBox->SelectedItem转换成绑定的容器类型。   然后再取值。谢版主,么么哒,恩啊~

    2013年12月11日 8:48