如何获得ComboBox内容的价值?

时间:2016-05-10 19:17:49

标签: c# wpf combobox win-universal-app

我想从我的组合框中获取内容。我已经尝试过一些方法来做到这一点,但它无法正常工作。

这是我的组合框的例子:

<ComboBox x:Name="cmbSomething" Grid.Column="1" Grid.Row="5" HorizontalAlignment="Center" Margin="0 100 0 0" PlaceholderText="NothingToShow">
    <ComboBoxItem>First item</ComboBoxItem>
    <ComboBoxItem>Second item</ComboBoxItem>
</ComboBox>

单击按钮后,我想显示组合框选择的项目值。

string selectedcmb= cmbSomething.Items[cmbSomething.SelectedIndex].ToString();
await new Windows.UI.Popups.MessageDialog(selectedcmb, "Result").ShowAsync();

为什么这段代码不起作用? 我的结果不是显示组合框内容,而是显示了这个文字:

  

Windows.UI.Xaml.Controls.ComboBoxItem

2 个答案:

答案 0 :(得分:2)

您需要stim_proc : process的{​​{1}}属性。所以这应该是你想要的:

Content

答案 1 :(得分:0)

我已经扩展了关于使用模型而不是直接UI代码隐藏访问的建议。这些是必需的部分:

BaseViewModel.cs

我在我的工作项目中的很多视图模型中使用它。您可以在视图模型中直接实现它,但我喜欢将它集中在一起以便重复使用。

public abstract class BaseViewModel : INotifyPropertyChanged
{
  public event PropertyChangedEventHandler PropertyChanged;
  private Hashtable values = new Hashtable();

  protected void SetValue(string name, object value)
  {
     this.values[name] = value;
     OnPropertyChanged(name);
  }

  protected object GetValue(string name)
  {
     return this.values[name];
  }

  protected void OnPropertyChanged(string name)
  {
     PropertyChangedEventHandler handler = PropertyChanged;
     if (handler != null)
     {
        handler(this, new PropertyChangedEventArgs(name));
     }
  }
}

ComboViewModel.cs

这将使您轻松获得价值。我称之为ComboViewModel,因为我只处理你的ComboBox。您需要一个具有更好名称的更大视图模型来处理所有数据绑定。

public class ComboViewModel : BaseViewModel
{

  public ComboViewModel()
  {
     Index = -1;
     Value = string.Empty;
     Items = null;
  }

  public int Index
  {
     get { return (int)GetValue("Index"); }
     set { SetValue("Index", value); }
  }
  public string Value
  {
     get { return (string)GetValue("Value"); }
     set { SetValue("Value", value); }
  }
  public List<string> Items
  {
     get { return (List<string>)GetValue("Items"); }
     set { SetValue("Items",value); }
  }
}

Window1.xaml

这只是我用来演示/测试它的东西。注意各种绑定。

<Window x:Class="SO37147147.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="300" Width="300">
    <Grid>
      <Grid.RowDefinitions>
         <RowDefinition Height="Auto" />
         <RowDefinition Height="*" />
         <RowDefinition Height="Auto" />
      </Grid.RowDefinitions>
      <Grid.ColumnDefinitions>
         <ColumnDefinition Width="*" />
         <ColumnDefinition Width="Auto" />
      </Grid.ColumnDefinitions>
      <ComboBox x:Name="cmbSomething" Grid.Column="0" Grid.ColumnSpan="2" Grid.Row="0" HorizontalAlignment="Center" MinWidth="80"
                ItemsSource="{Binding Path=Items}" SelectedIndex="{Binding Path=Index}" SelectedValue="{Binding Path=Value}"></ComboBox>
      <TextBox x:Name="selectedItem" MinWidth="80" Grid.Row="2" Grid.Column="0" Text="{Binding Path=Value}" />
      <Button x:Name="displaySelected" MinWidth="40" Grid.Row="2" Grid.Column="1" Content="Display" Click="displaySelected_Click" />
   </Grid>
</Window>

Window1.xaml.cs

这是代码隐藏。不是很多!通过dataContext实例访问所有内容。没有必要知道控件名称等。

public partial class Window1 : Window
{
  ComboViewModel dataContext = new ComboViewModel();

  public Window1()
  {
     InitializeComponent();
     dataContext.Items=new List<string>(new string[]{"First Item","Second Item"});
     this.DataContext = dataContext;
  }

  private void displaySelected_Click(object sender, RoutedEventArgs e)
  {
     MessageBox.Show(String.Format("Selected item:\n\nIndex: {0}\nValue: {1}", dataContext.Index, dataContext.Value));
  }
}

您可以添加业务逻辑,以便从数据库填充模型,保存对数据库的更改等。当您更改视图模型的属性时,UI将自动更新。