C# WPF组合框-按标记选择项目
我有一个这样的组合框C# WPF组合框-按标记选择项目,c#,wpf,xaml,combobox,C#,Wpf,Xaml,Combobox,我有一个这样的组合框 <ComboBox Name="myMenu"> <ComboBoxItem Content="Question 1" Tag="1" /> <ComboBoxItem Content="Question 2" Tag="2" /> <ComboBoxItem Content="Question 3" Tag="3" /> <ComboBoxI
<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>
看起来您正在查找ComboBox控件的ProeProperty SelectedValuePath。参见这里的示例 对于那些在上面的链接下找不到榜样并一直投反对票的人,我准备了我自己的榜样。它突出显示了如何设置组合框并通过指定选定值来选择适当的项 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;
}
}
使用System.Windows;
命名空间WpfApp1
{
///
///MainWindow.xaml的交互逻辑
///
公共部分类主窗口:窗口
{
公共主窗口()
{
初始化组件();
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
myMenu.SelectedValue=+\u计数器;
如果(_counter>3)_counter=0;
}
专用int_计数器=0;
}
}
您应该使用数据绑定实现类似的功能,但您可以使用LINQ:
int tagToSelect = 3;
myMenu.SelectedItem = myMenu.Items.Single(t => t.Tag.Equals(tagToSelect));
可以将选定的combox值绑定到依赖项属性。例如,下面是一个具有依赖属性“CurrentTag”的窗口: 在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”)出于好奇,为什么需要按标记选择项目?你能解释一下这个用例吗?当一个简单的CLR属性可以达到这个目的时,为什么要创建一个DP?对于一个简单的属性,当“CurrentTag”的值被修改时,组合框不会自动更新。是的,ViewModel类应该为此实现INotifyPropertyChanged接口,我们通常会这样做。就个人而言,当可以通过CLR属性创建静态DP时,我避免创建静态DP。
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); }
}
}
<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>