UWP zone de liste déroulante de liaison à la propriété SelectedItem
Je suis en train d'essayer d'obtenir une zone de liste déroulante à travailler avec la liaison de sorte que je peux éventuellement l'utiliser pour certains paramètres. Je peux obtenir les éléments à renseigner à partir d'une collection observable et de liaison "SelectedItem" pour une propriété SelectedItem="{x:Bind SelectedComboBoxOption}"
Mais lorsque je change la sélection ce n'est pas reflétée dans la zone de texte également lié à cette propriété. Dans le code derrière elle définit la propriété une fois sur le lancement, mais pas lors de la modification d'éléments dans la zone de liste déroulante. Quelque chose doit m'échapper, mais il n'est pas clair pour moi quoi. Des idées?
C'est le code 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>
Et c'est le code-behind:
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;
}
}
OriginalL'auteur RonaldA | 2015-11-20
Vous devez vous connecter pour publier un commentaire.
@Mike Eason et @kubakista dit, vous devez définir
Mode
explicitement. Mais ce ne sera pas résolu votre problème complètement.Dans votre code, votre
SelectedComboBoxOption
est une chaîne de caractères, mais laSelectedItem
est unComboBoxItem
objet. La liaison d'uneString
àSelectedItem
ne changera pasComboBox
'élément sélectionné. Donc, si vous voulez utiliserSelectedComboBoxOption
d'obtenir et de définirComboBox
'élément sélectionné, vous avez besoin de changerSelectedComboBoxOption
àComboBoxItem
et l'utilisation d'un Convertir en{x:Bind}
pour convertir entreObject
etComboBoxItem
.La conversion peut comme:
Le XAML peut comme:
Dans le code-behind:
Si vous voulez juste pour afficher l'élément sélectionné dans
TextBlock
, il est un moyen facile. Nous pouvons lierTextBlock
'sText
propriétéComboBox
'sSelectedItem
. Et s'il vous plaît noter queSelectedItem
's est de typeSystem.Object
et{x:Bind}
est fortement typé, et permettra de résoudre le type de chaque étape du chemin. Si le type retourné n'a pas les membres, il ne sera pas au moment de la compilation. Nous avons donc besoin de spécifier un casting à dire la liaison du type réel de l'objet. Mais il y a un question tout en fonte classe imbriquée dans{x:Bind}
. Nous pouvons mettreComboBoxItem
deMainPage
comme une solution de contournement.Et dans le code XAML:
Je l'ai eu en face de la question. Après l'initialisation, elle est vide et vous pouvez sélectionner normalement. Pourriez-vous jeter un oeil à ce problème, s'il vous plaît? Merci!!!! stackoverflow.com/questions/39090923/...
OriginalL'auteur Jay Zuo
Par défaut,
x:Bind
est fixé àOneTime
. Vous pouvez remédier à cela en définissant simplement le mode deOneWay
.Pour SelectedItem garder
Mode=TwoWay
mais pour votreText
propriété dansTextBlock
vous devez utiliserMode=OneWay
.OriginalL'auteur Mike Eason