WPF组合框 - 按标签选择项目

9
我有一个下拉框,如下所示:
    <ComboBox Name="myMenu">
        <ComboBoxItem Content="Question 1" Tag="1"  />
        <ComboBoxItem Content="Question 2" Tag="2"  />
        <ComboBoxItem Content="Question 3" Tag="3"  />
        <ComboBoxItem Content="Question 4" Tag="4"  />
    </ComboBox>

如何通过标签值编程设置所选索引?例如,'myMenu.selectedTag = 3',问题3将成为所选项?

我希望有比我目前的解决方案更简单的方法...

      int tagToSelect = 3;
      foreach (ComboBoxItem item in myMenu.Items)
      {
          if(item.Tag.Equals(tagToSelect)
          {
               myMenu.SelectedItem = item;
          }
      }

2
只是出于好奇,为什么您需要按标签选择项目?您能解释一下使用情况吗? - Amittai Shapira
3个回答

3
看起来你正在寻找ComboBox控件的属性SelectedValuePath。请参见此处的示例:http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.selector.selectedvaluepath.aspx 对于那些找不到上面链接中的示例并继续投反对票的人,我准备了自己的示例。它突出显示了如何设置ComboBox并通过分配所选值来选择适当的项。
MainWindow.xaml
<Window x:Class="WpfApp1.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d" Height="97" Width="202">
<Window.Resources>
    <XmlDataProvider x:Key="Questions" XPath="/Questions/*">
        <x:XData>
            <Questions xmlns="">
                <Question Title="Question 1" Index="1" />
                <Question Title="Question 2" Index="2" />
                <Question Title="Question 3" Index="3" />
                <Question Title="Question 4" Index="4" />
            </Questions>
        </x:XData>
    </XmlDataProvider>
    <DataTemplate x:Key="QuestionItemTemplate">
        <TextBlock Text="{Binding XPath=@Title}" />
    </DataTemplate>
</Window.Resources>
<StackPanel>
    <ComboBox Name="myMenu"
              ItemsSource="{Binding Source={StaticResource Questions}}"
              ItemTemplate="{StaticResource QuestionItemTemplate}"
              SelectedValuePath="@Index"/>
    <TextBlock Text="{Binding ElementName=myMenu, 
        Path=SelectedValue, StringFormat=Selected Index: {0:D}}"/>
    <Button Content="Select another item" Click="Button_Click" />
</StackPanel>

MainWindow.xaml.cs

using System.Windows;

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

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            myMenu.SelectedValue = ++_counter;
            if (_counter > 3) _counter = 0;
        }

        private int _counter = 0;

    }
}

0
你应该在这种情况下使用数据绑定,但你也可以使用 LINQ 来实现:
int tagToSelect = 3;
myMenu.SelectedItem = myMenu.Items.Single(t => t.Tag.Equals(tagToSelect));

0

您可以将所选的组合框值绑定到依赖属性。例如,这里有一个具有依赖属性“CurrentTag”的窗口:

public partial class Window1 : Window
{
    public Window1()
    {
        InitializeComponent();
    }

    public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        CurrentTag = "4";
    }

    public static readonly DependencyProperty CurrentTagProperty = DependencyProperty.Register(
        "CurrentTag", typeof(string), typeof(Window1),
        new PropertyMetadata("1"));

    public string CurrentTag
    {
        get { return (string)this.GetValue(CurrentTagProperty); }
        set { this.SetValue(CurrentTagProperty, value); }
    }
}

在 XAML 中:

<Window x:Class="WpfComboboxBinding.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="Window1" Height="100" Width="300"
    x:Name="window1">
    <StackPanel VerticalAlignment="Center">

        <ComboBox Name="myMenu"
              SelectedValue="{Binding ElementName=window1, Path=CurrentTag, Mode=TwoWay}"
                 SelectedValuePath="Tag">
            <ComboBoxItem Content="Question 1" Tag="1"  />
            <ComboBoxItem Content="Question 2" Tag="2"  />
            <ComboBoxItem Content="Question 3" Tag="3"  />
            <ComboBoxItem Content="Question 4" Tag="4"  />
        </ComboBox>

    </StackPanel>
</Window>

然后要更改所选项目,只需修改属性的值,就像上面的示例一样(CurrentTag =“4”;)。


为什么要创建一个 DP,当一个简单的 CLR 属性就可以达到同样的目的呢? - Rohit Vats
通过一个简单的属性,当“CurrentTag”的值被修改时,组合框不会自动更新。 - Jem
是的,ViewModel类应该实现INotifyPropertyChanged接口,我们通常会这样做。个人而言,如果可以通过CLR属性来完成,我会避免创建静态DP。 - Rohit Vats

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接