将ComboBox选定项作为方法参数传递的正确方法是什么?

还是这样做有什么好处?

我在程序设计和传递参数方面经验有限。


这是一个示例方法,它返回选定颜色的相反颜色。

XAML

<ComboBox x:Name="cboColors" 
          HorizontalAlignment="Left" 
          Margin="179,82,0,0" 
          VerticalAlignment="Top"
          Width="120"
          SelectedIndex="0">
    <System:String>Red</System:String>
    <System:String>Orange</System:String>
    <System:String>Yellow</System:String>
    <System:String>Green</System:String>
    <System:String>Blue</System:String>
    <System:String>Purple</System:String>
</ComboBox>

夏普

硬编码

ComboBox Selected Item在if语句中设置

// Find Opposite Color
//
public String OppositeColor()
{
    if ((string)cboColors.SelectedItem == "Red")
    {
        return "Green";
    }
    else if ((string)cboColors.SelectedItem == "Orange")
    {
        return "Blue";
    }
    else if ((string)cboColors.SelectedItem == "Yellow")
    {
        return "Purple";
    }
    else if ((string)cboColors.SelectedItem == "Green")
    {
        return "Red";
    }
    else if ((string)cboColors.SelectedItem == "Blue")
    {
        return "Orange";
    }
    else if ((string)cboColors.SelectedItem == "Purple")
    {
        return "Yellow";
    }
    else
    {
        return string.Empty;
    }
}


// Display Opposite Color Button
//
private void button_Click(object sender, RoutedEventArgs e)
{
    MessageBox.Show(OppositeColor());
}

传递参数

将ComboBox Selected Item设置为Object然后传递给Method

// Find Opposite Color
//
public String OppositeColor(Object color)
{
    if (color.Equals("Red"))
    {
        return "Green";
    }

    ...
}


// Display Opposite Color Button
//    
private void button_Click(object sender, RoutedEventArgs e)
{
    // Set Selected Color
    Object color = cboColors.SelectedItem;

    // Display
    MessageBox.Show(OppositeColor(color));
}

#1楼 票数:2 已采纳

WPF具有可以帮助您的绑定。 如果您创建一个简单的帮助器类来表示组合框中的项目:

public class ComboItem
{
  public string Color { get; private set; }
  public string OppositeColor { get; private set; }

  public ComboItem(string color, string opposite)
  {
    Color = color;
    OppositeColor = opposite;
  }
}

并且在后面的代码中有一个组合框可以绑定到的集合:

private List<ComboItem> _myComboItems = new List<ComboItem>()
{
  new ComboItem("Red", "Green"),
  new ComboItem("Orange", "Blue"),
  new ComboItem("Yellow", "Purple"),
  new ComboItem("Green", "Red"),
  new ComboItem("Blue", "Orange"),
  new ComboItem("Purple", "Yellow")
};

public List<ComboItem> MyComboItems
{
  get { return _myComboItems; }
}

实现INotifyPropertyChanged接口,以在视图中的属性发生更改时(无需实现和依赖属性)事件到UI:

public event PropertyChangedEventHandler PropertyChanged;

private void OnPropertyChanged(string propertyName)
{
  PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}

以及用户选择时要设置的项目:

private ComboItem _selected = null;

public ComboItem SelectedComboItem
{ 
  get { return _selected; }
  set
  {
    _selected = value;
    OnPropertyChanged("SelectedComboItem");
  }
}

您可以将xaml设置为:

<ComboBox ItemsSource="{Binding MyComboItems}"
          SelectedItem="{Binding SelectedComboItem}"
          DisplayMemberPath="Color"/>

一旦到位,当用户按下按钮(button1)时,您的处理程序就可以通过几种不同的方式执行您想要的操作:

private void button_Click(object sender, RoutedEventArgs e)
{
  MessageBox.Show(SelectedComboItem.OppositeColor);
}

它直接为相反的颜色或您要传递的参数访问selected items属性。

private void button_Click(object sender, RoutedEventArgs e)
{
  MessageBox.Show(GetOppositeColor(SelectedComboItem));
}

private string GetOppositeColor(ComboItem item)
{
  if (item != null)
    return item.OppositeColor;

  return "No opposite color available";
}

要设置组合中的初始选定项:

InitializeComponent();
// some other initialization code here...
SelectedComboItem = MyComboItems[0];

属性SelectedComboItem的此设置将引起PropertyChanged事件(通过OnPropertyChanged触发),组合框将获取该事件并调整其选定的项目。

IMO保持类型对于可读性和效率很重要。 将值更改为Object类型,然后强制转换为它的特定类型,或者使用ToString(),效率不如将其始终保持为始终以其开头并访问其值的类型,而且还使得在键入类型时更难遵循代码变形为对象并再次返回。

我的代码示例消除了使用将字符串配对在一起的集合,而赞成使用类来包装关系。 这使您能够利用WPF的魔力来获取用户交互事件(例如,选择组合中的一项),并自动(通过SelectedItem绑定)访问所选内容所代表的对象。

希望这可以帮助。

#2楼 票数:1

要获取所选项目的字符串,您需要调用ToString() 然后,您可以将字符串传递给任何方法,而不是对象。 话虽这么说,您可以创建一个Dictionary<string selected,string opposite>以使用所选项目的名称而不是使用if/elseswitch语句轻松获得相反的颜色:

private static Dictionary<string, string> _oppositesDictionary = new Dictionary<string, string>()
{
    {"Green", "Red"},
    {"Orange", "Blue"},
    {"Yellow", "Purple"},
    {"Red", "Green"},
    {"Blue", "Orange"},
    {"Purple", "Yellow"}
};

用法:

public string OppositeColor(string color)
{
    //No need to check if key exists
    return _oppositesDictionary[color];
}



private void button_Click(object sender, RoutedEventArgs e)
{
    string color = cboColors.SelectedItem.ToString();

    MessageBox.Show(OppositeColor(color));
}

更新:

如果要基于颜色名称执行小任务,请使用switch语句。

如果要基于颜色名称执行不同的任务 (无需重复代码!),则可能需要创建Dictionary<string, Action</* params type*/>>Dictionary<string, Func</* return type*/, /*params type*/>>如果您想返回一个值。
因为您仅向我们展示了您想要的示例,所以我只能认为这是一个过大的技巧:

//Methods have to be static when using a field initializer
//Func<string> returns a string and has no paramters
private static Dictionary<string, Func<string>> _colorFunc = new Dictionary<string, Func<string>>()
{
    {"Green", GreenFunc},
    {"Orange", BlueFunc}
    ....
};

private static string GreenFunc()
{
    // green logic
    return "Red";
}

//Usage
public string OppositeColor(string color)
{
    return _colorFunc[color]();
}

  ask by Matt McManis translate from so

未解决问题?本站智能推荐:

1回复

如何将在UserControl组合框中选择的项目传递到主窗口ViewModel

我有一个带有3 RadioButtons和UserControl MyDataSelector的父视图。 MyDataSelector由ComboBox和其他几个简单的控件(CheckBox,Button等)组成。 MyDataSelector的ComboBox应该填充不同的项目,具体取决于
1回复

组合框选择的项目绑定到GridViewColumn,而GridViewColumn绑定到组合框选择的项目

我试图将我选择的组合框值=设置为文本框值。 我希望仅在可能的情况下将其保存在xaml中。 问题不在于所选列表项没有更新,而是组合框所选更新没有更新以匹配列表视图所选项。 是的,Values [0] .Value具有INotifyPropertyChanged接口。
1回复

WPF ComboBox选定的项目为字符串

我有一个组合框,我试图将x:Name或选定的comboItem的内容(都可以,我会更简单的一个)设置到列表中。 但是我总是像这样:System.Window.Controls.StackPanel或System.Window.Controls.Comboboxitem .. 我试图通过多
2回复

将组合框所选项目绑定到设置

我使用应用程序设置属性和数据绑定存储用户指定的设置。 它一直运行良好,直到我希望用户选择组合框字体。 用户设置和组合框之间的数据绑定不起作用。 我要存储字体系列名称。 Window.XML 设置:字体字符串用户Arial
1回复

WPF Combobox 绑定选定项

我有以下问题。 我有这个模型: Class A包含一个对象 ob Class B 。 我的ViewModel包含两个列表。 一个 A 类对象列表 (ListOne) 和第二个列表 (ListTwo) 包含 B 类对象。 现在我想将listTwo绑定到嵌入listbox combobox li
3回复

使用自定义项模板在ComboBox中显示所选项

我使用此页面中的代码来设置我的组合框样式: 如何在鼠标悬停上设置ComboBox背景样式? 我已更改了默认项目模板,但现在它们不会出现在所选值区域中。 在下图中,您可以看到问题以及我想要实现的目标。 这是我在App.xaml中的XAML: MainWindow.xaml:
4回复

如何在 WPF 中居中对齐组合框所选项目

我希望组合框选定的项目单独居中对齐,而下拉内容左对齐。 为了实现这一点,我制作了默认组合框的完整副本,并将切换按钮水平对齐的内容展示器修改为中心 有没有比编辑整个模板更简单的方法来实现这一点
1回复

从组合框WPF中获取选定的项目

如何从C#的组合框中获取选定的值? 我试过这样的事情: XAML C# 消息框显示了此System.Windows.Controls.ComboboxItem:Item2 我只需要展示Item2 我怎样才能做到这一点? 谢谢