UWP Combobox绑定到SelectedItem属性
我正在尝试使用combobox来处理绑定,以便最终可以将其用于某些设置。 我可以从一个可观察的集合中获取要填充的项目,并将’SelectedItem’绑定到一个属性SelectedItem="{x:Bind SelectedComboBoxOption}"
但是当我更改选择时,这不会反映在也绑定到此属性的文本框中。 在它背后的代码中,在启动时设置属性一次,但在更改combobox中的项目时则不设置。 我必须遗漏一些东西,但我不清楚是什么。 有任何想法吗?
这是XAML:
这就是背后的代码:
using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.ComponentModel; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; namespace ComboBoxTest { public sealed partial class MainPage : Page, INotifyPropertyChanged { private ObservableCollection ComboBoxOptions; public MainPage() { this.InitializeComponent(); ComboBoxOptions = new ObservableCollection(); ComboBoxOptionsManager.GetComboBoxList(ComboBoxOptions); } public class ComboBoxItem { public string ComboBoxOption { get; set; } public string ComboBoxHumanReadableOption { get; set; } } public class ComboBoxOptionsManager { public static void GetComboBoxList(ObservableCollection ComboBoxItems) { var allItems = getComboBoxItems(); ComboBoxItems.Clear(); allItems.ForEach(p => ComboBoxItems.Add(p)); } private static List getComboBoxItems() { var items = new List(); items.Add(new ComboBoxItem() { ComboBoxOption = "Option1", ComboBoxHumanReadableOption = "Option 1" }); items.Add(new ComboBoxItem() { ComboBoxOption = "Option2", ComboBoxHumanReadableOption = "Option 2" }); items.Add(new ComboBoxItem() { ComboBoxOption = "Option3", ComboBoxHumanReadableOption = "Option 3" }); return items; } } string _SelectedComboBoxOption = "Option1"; public string SelectedComboBoxOption { get { return _SelectedComboBoxOption; } set { if (_SelectedComboBoxOption != value) { _SelectedComboBoxOption = value; RaisePropertyChanged("SelectedComboBoxOption"); } } } void RaisePropertyChanged(string prop) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(prop)); } } public event PropertyChangedEventHandler PropertyChanged; } }
正如@Mike Eason和@kubakista所说,你需要明确设置Mode
。 但这不会完全解决您的问题。
在您的代码中,您的SelectedComboBoxOption
是一个字符串,但SelectedItem
是一个ComboBoxItem
对象。 将String
绑定到SelectedItem
不会更改ComboBox
的选定项。 因此,如果您想使用SelectedComboBoxOption
来获取和设置ComboBox
的选定项,您需要将SelectedComboBoxOption
更改为ComboBoxItem
并使用转换{x:Bind}
来转换Object
和ComboBoxItem
。
转换可能喜欢:
public class ComboBoxItemConvert : IValueConverter { public object Convert(object value, Type targetType, object parameter, string language) { return value; } public object ConvertBack(object value, Type targetType, object parameter, string language) { return value as MainPage.ComboBoxItem; } }
XAML可能会喜欢:
在代码隐藏中:
public sealed partial class MainPage : Page, INotifyPropertyChanged { private ObservableCollection ComboBoxOptions; public MainPage() { this.InitializeComponent(); ComboBoxOptions = new ObservableCollection (); ComboBoxOptionsManager.GetComboBoxList(ComboBoxOptions); SelectedComboBoxOption = ComboBoxOptions[0]; } ... private ComboBoxItem _SelectedComboBoxOption; public ComboBoxItem SelectedComboBoxOption { get { return _SelectedComboBoxOption; } set { if (_SelectedComboBoxOption != value) { _SelectedComboBoxOption = value; RaisePropertyChanged("SelectedComboBoxOption"); } } } ... }
如果您只想在TextBlock
显示所选项目,则有一种简单的方法。 我们可以将TextBlock
的Text
属性绑定到ComboBox
的SelectedItem
。 请注意, SelectedItem
的类型是System.Object
, {x:Bind}
是强类型的,它将解析路径中每个步骤的类型。 如果返回的类型没有该成员,则它将在编译时失败。 所以我们需要指定一个强制转换来告诉绑定对象的真实类型。 但是在{x:Bind}
构建嵌套类时会出现问题 。 我们可以将ComboBoxItem
放在MainPage
作为解决方法。
namespace ComboBoxTest { public class ComboBoxItem { public string ComboBoxOption { get; set; } public string ComboBoxHumanReadableOption { get; set; } } public sealed partial class MainPage : Page, INotifyPropertyChanged { ... } }
而在XAML中:
默认情况下, x:Bind
设置为OneTime
。 您可以通过简单地将模式设置为OneWay
来解决此问题。
Text="{x:Bind SelectedComboBoxOption, Mode=OneWay}"