2015-11-07 72 views
0

(我读过类似的职位,但他们都有一个转折他们做出不同的解决方案)设置所选项目

我移植WinForms应用程序所使用的:

myComboBox.SetSelected(myComboBox.FindString("Some Text"), true); 

以编程方式选择一个项目。当移植到WPF,我试过,但它没有任何效果(该项目不会被选中):

myComboBox.SelectedItem = myComboBox.FindName("Some Text"); 

什么是选择在一个ComboBox现有项目的正确方法,在WPF?

+0

什么是你的itemsource? – Sajeetharan

+0

你可以在这里找到答案https://www.google.com.ph/url?sa=t&source=web&rct=j&url=http://stackoverflow.com/questions/21476979/why-does-the-combobox-findname -method-always-return-null&ved = 0CBwQFjAAahUKEwiEoZyk1v3IAhUD5KYKHew9DuQ&usg = AFQjCNGMrZHFUpcCyZhk-L8amDlp_mxSIg&sig2 = KwxsuSAuv6UKhLJYOOlhVw – tgpdyk

+1

答案取决于您的代码,[您没有提供](http://stackoverflow.com/help/mcve)。即使您展示的Winforms示例坦率地说也不是一个好方法。在WPF中,你应该有一个绑定到'ComboBox.ItemsSource'的集合,并且你可以将SelectedItem设置为该集合元素的引用。你如何查看它取决于代码的确切实现。 –

回答

1

您必须使用SelectedValue。在WPF组合框中,有多种方法可以实现相同的功能。因此,以编程方式选择项目的一种语法将不起作用。将项目添加到ComboBox有很多种方法。

  1. 您可以声明性地或在代码中设置ItemsSource。
  2. 您可以添加ComboBoxItems等。请参阅属性窗口中的项目属性以查看各种可用的项目类型。

如果您使用的ItemsSource字符串值,那么你需要的语法,如:cmb1.SelectedValue = "Name1"

如果直接添加项目,如<ComboBox ...> <ComboBoxItem Content="Name1"/> </ComboBox/>,那么你需要

foreach (ComboBoxItem item in cmb2.Items) 
     if (item.Content.ToString() == "Name1") 
     { 
     cmb2.SelectedValue = item; 
     break; 
     } 

我已经发布了一个完整的演示如何在各种场景中以编程方式选择项目。示例代码(可以按原样使用):

注意上一个,您必须使用SelectedValuePath。

Window1.xaml

<Window x:Class="WpfApplicationBlend.Window1" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    Title="Window1" Height="411" Width="749"> 

<Grid> 
    <Grid Margin="30,27,491,276"> 
     <ComboBox x:Name="cmb1" HorizontalAlignment="Left" Margin="0,28,0,0" VerticalAlignment="Top" Width="210" Height="25" FocusVisualStyle="{DynamicResource StyleFocusDefault}"> 
      <ComboBox.ItemsSource> 
       <CompositeCollection> 
        <sys:String>Name1</sys:String> 
        <sys:String>Name2</sys:String> 
        <sys:String>Name3</sys:String> 
        <sys:String>Name4</sys:String> 
       </CompositeCollection> 
      </ComboBox.ItemsSource> 
     </ComboBox> 
     <TextBox x:Name="tbInput1" HorizontalAlignment="Left" Height="23" Margin="10,0,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="135,1,0,0" VerticalAlignment="Top" Width="75" Click="Button1_Click"/> 
    </Grid> 

    <Grid Margin="405,27,111,276"> 
     <ComboBox x:Name="cmb2" HorizontalAlignment="Left" Margin="0,28,0,0" VerticalAlignment="Top" Width="210" Height="25" FocusVisualStyle="{DynamicResource StyleFocusDefault}"> 
      <ComboBoxItem Content="Name1"/> 
      <ComboBoxItem Content="Name2"/> 
      <ComboBoxItem Content="Name3"/> 
     </ComboBox> 
     <TextBox x:Name="tbInput2" HorizontalAlignment="Left" Height="23" Margin="10,0,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="135,1,0,0" VerticalAlignment="Top" Width="75" Click="Button2_Click"/> 
    </Grid> 

    <Grid Margin="30,207,491,96"> 
     <ComboBox x:Name="cmb3" HorizontalAlignment="Left" Margin="0,28,0,0" VerticalAlignment="Top" Width="210" Height="25" FocusVisualStyle="{DynamicResource StyleFocusDefault}"> 
      <ComboBox.ItemsSource> 
       <CompositeCollection> 
        <sys:String>Name1</sys:String> 
        <sys:Boolean>True</sys:Boolean> 
        <sys:Int32>123</sys:Int32> 
       </CompositeCollection> 
      </ComboBox.ItemsSource> 
     </ComboBox> 
     <TextBox x:Name="tbInput3" HorizontalAlignment="Left" Height="23" Margin="10,0,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="135,1,0,0" VerticalAlignment="Top" Width="75" Click="Button3_Click"/> 
    </Grid> 

    <Grid Margin="405,207,116,96"> 
     <ComboBox x:Name="cmb4" HorizontalAlignment="Left" Margin="0,28,0,0" VerticalAlignment="Top" Width="210" Height="25" SelectedValuePath="Name" DisplayMemberPath="Name"> 
     </ComboBox> 
     <TextBox x:Name="tbInput4" HorizontalAlignment="Left" Height="23" Margin="10,0,0,0" TextWrapping="Wrap" VerticalAlignment="Top" Width="120"/> 
     <Button Content="Button" HorizontalAlignment="Left" Margin="135,1,0,0" VerticalAlignment="Top" Width="75" Click="Button4_Click"/> 
    </Grid> 
</Grid> 
    </Window> 

Window1.xaml.cs

using System; 
using System.Collections.Generic; 
using System.Windows; 
using System.Windows.Controls; 
using System.Windows.Data; 
using System.Collections; 

namespace WpfApplicationBlend 
{ 
    /// <summary> 
    /// Interaction logic for Window1.xaml 
    /// </summary> 
    public partial class Window1 : Window 
    { 
     public Window1() 
     { 
      InitializeComponent(); 

      List<Employee> employees = new List<Employee>() 
      { 
       new Employee(){Name="Name1", Age=100}, 
       new Employee(){Name="Name2", Age=101}, 
      }; 

      cmb4.ItemsSource = employees; 
     } 

     private void Button1_Click(object sender, RoutedEventArgs e) 
     { 
      cmb1.SelectedValue = tbInput1.Text; 
     } 

     private void Button2_Click(object sender, RoutedEventArgs e) 
     { 
      foreach (ComboBoxItem item in cmb2.Items) 
       if (item.Content.ToString() == tbInput2.Text) 
       { 
        cmb2.SelectedValue = item; 
        break; 
       } 
     } 

     private void Button3_Click(object sender, RoutedEventArgs e) 
     { 
      foreach (object item in cmb3.Items) 
       if (item.ToString() == tbInput3.Text) 
       { 
        cmb3.SelectedValue = item; 
        break; 
       } 
     } 

     private void Button4_Click(object sender, RoutedEventArgs e) 
     { 
      cmb4.SelectedValue = tbInput4.Text; 
     } 
    } 

    public class Employee 
    { 
     public string Name { get; set; } 
     public int Age { get; set; } 
    } 
} 
-1
comboboxName.SelectedIndex = yourIndex; 

例如

combobox1.SelectedIndex = 2;