我正在尝试使用组合框来处理绑定,以便最终可以将其用于某些设置 . 我可以从一个可观察的集合中获取要填充的项目并将'SelectedItem'绑定到属性 SelectedItem="{x:Bind SelectedComboBoxOption}"
但是当我更改选择时,这不会反映在也绑定到此属性的文本框中 . 在它背后的代码中,在启动时设置属性一次,但在更改组合框中的项时不设置 . 我必须遗漏一些东西,但我不清楚是什么 . 有任何想法吗?
这是XAML:
<Page
x:Class="ComboBoxTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:ComboBoxTest"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<StackPanel>
<ComboBox
Name="ComboBox"
ItemsSource="{x:Bind ComboBoxOptions}"
SelectedItem="{x:Bind SelectedComboBoxOption, Mode=TwoWay}"
SelectedValuePath="ComboBoxOption"
DisplayMemberPath="ComboBoxHumanReadableOption"
Header="ComboBox" >
</ComboBox>
<TextBlock Name="BoundTextblock" Text="{x:Bind SelectedComboBoxOption}"/>
</StackPanel>
</Grid>
这就是背后的代码:
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<ComboBoxItem> ComboBoxOptions;
public MainPage()
{
this.InitializeComponent();
ComboBoxOptions = new ObservableCollection<ComboBoxItem>();
ComboBoxOptionsManager.GetComboBoxList(ComboBoxOptions);
}
public class ComboBoxItem
{
public string ComboBoxOption { get; set; }
public string ComboBoxHumanReadableOption { get; set; }
}
public class ComboBoxOptionsManager
{
public static void GetComboBoxList(ObservableCollection<ComboBoxItem> ComboBoxItems)
{
var allItems = getComboBoxItems();
ComboBoxItems.Clear();
allItems.ForEach(p => ComboBoxItems.Add(p));
}
private static List<ComboBoxItem> getComboBoxItems()
{
var items = new List<ComboBoxItem>();
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;
}
}
3 回答
正如@Mike Eason和@kubakista所说,你需要明确地设置
Mode
. 但这不会完全解决您的问题 .在您的代码中,
SelectedComboBoxOption
是一个字符串,但SelectedItem
是一个ComboBoxItem
对象 . 将String
绑定到SelectedItem
不会更改ComboBox
的所选项目 . 因此,如果您想使用SelectedComboBoxOption
获取并设置ComboBox
的所选项目,则需要将SelectedComboBoxOption
更改为ComboBoxItem
并使用{x:Bind}
中的转换来在Object
和ComboBoxItem
之间进行转换 .The Convert may like:
The XAML may like:
In the code-behind:
如果您只想在
TextBlock
中显示所选项目,则有一种简单的方法 . 我们可以将TextBlock
的Text
属性绑定到ComboBox
的SelectedItem
. 请注意SelectedItem
的类型是System.Object
和{x:Bind}
是强类型的,并将解析路径中每个步骤的类型 . 如果返回的类型没有该成员,则它将在编译时失败 . 所以我们需要指定一个强制转换来告诉绑定对象的真实类型 . 但是在{x:Bind}
中嵌入了一个issue嵌套类 . 我们可以将ComboBoxItem
作为解决方法放在MainPage
之外 .而在XAML中:
默认情况下,
x:Bind
设置为OneTime
. 您只需将模式设置为OneWay
即可解决此问题 .另一个解决方案(更像MVVM)是在你的代码隐藏中创建一个ComboBoxItem类型的对象,绑定到该对象,然后让你的代码隐藏操作对象以获得所需的字符串 . 这将消除您必须创建转换器: