Dan*_*ode 2 c# xaml combobox win-universal-app uwp
首先,不是重复的。
TextBox和CheckBox可以正常工作,而不是ComboBox。
internal class Word : _Model
{
public enum Categories
{
Noun,
Verb,
}
private Categories category;
public Categories Category
{
get
{
return this.category;
}
set
{
this.SetProperty(ref this.category,
value);
}
}
}
Run Code Online (Sandbox Code Playgroud)
internal abstract class _Model : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected bool SetProperty<T>(ref T storage, T value, [CallerMemberName] string propertyName = null)
{
if (object.Equals(storage, value))
{
return false;
}
storage = value;
this.OnPropertyChanged(propertyName);
return true;
}
protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
var eventHandler = this.PropertyChanged;
if (eventHandler != null)
{
eventHandler(this, new PropertyChangedEventArgs(propertyName));
}
}
}
Run Code Online (Sandbox Code Playgroud)
public sealed partial class WordEditor : UserControl
{
public WordEditor()
{
this.Model = new Models.Word();
this.Model.Category = Models.Word.Categories.Verb;
this.InitializeComponent();
}
private Models.Word Model { get; set; }
internal IList<KeyValuePair<Models.Word.Categories, string>> Categories { get { return new List<KeyValuePair<Models.Word.Categories, string>>() { new KeyValuePair<Models.Word.Categories, string>(Models.Word.Categories.Noun, "Noun"), new KeyValuePair<Models.Word.Categories, string>(Models.Word.Categories.Verb, "Verb") }; } }
}
Run Code Online (Sandbox Code Playgroud)
<UserControl.Resources>
<converters:AnyConverter x:Key="AnyConverter"/>
</UserControl.Resources>
<StackPanel>
<ComboBox ItemsSource="{x:Bind Path=Categories, Mode=OneTime}"
DisplayMemberPath="Value"
SelectedValuePath="Key"
SelectedValue="{x:Bind Path=Model.Category, Mode=TwoWay, Converter={StaticResource ResourceKey=AnyConverter}}"/>
</StackPanel>
Run Code Online (Sandbox Code Playgroud)
internal class AnyConverter : 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;
}
}
Run Code Online (Sandbox Code Playgroud)
ComboBox的“动词”和“名词”正确显示,并且模型正确反映了“动词”或“名词”的选择。
但是,即使“类别”最初设置为“动词”,ComboBox也不会显示该信息。
如何解决它,使ComboBox首次出现时选择“动词”?
我转载了您的问题。这里的问题ComboBox.SelectedValue不适用于枚举类型。为了测试这一点,我们可以使用一个ComboBox不带绑定的SelectedValue代码,并将in-behind 设置为如下所示:
<ComboBox x:Name="cmb" DisplayMemberPath="Value" SelectedValuePath="Key" />
cmb.ItemsSource = Categories;
cmb.SelectedValue = Models.Word.Categories.Verb;
Run Code Online (Sandbox Code Playgroud)
虽然我已经设置Models.Word.Categories.Verb了SelectedValue,但是它的价值仍然是null。
但是,当Value类型为int或时,它可以工作string。根据我在WPF中的经验,枚举类型也应该起作用。我认为这可能是UWP中的错误。
作为一种解决方法,我认为您可以使用SelectedIndex或SelectedItem属性在ComboBox首次出现时选择“动词”。例如:
在XAML中,使用SelectedIndex代替SelectedValue:
<ComboBox DisplayMemberPath="Value"
ItemsSource="{x:Bind Path=Categories, Mode=OneTime}"
SelectedIndex="{x:Bind Path=Model.Category, Mode=TwoWay, Converter={StaticResource ResourceKey=AnyConverter}}"
SelectedValuePath="Key" />
Run Code Online (Sandbox Code Playgroud)
并更改Converter如下:
internal class AnyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return (int)(Models.Word.Categories)value;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return (Models.Word.Categories)(int)value;
}
}
Run Code Online (Sandbox Code Playgroud)
此后,设置this.Model.Category = Models.Word.Categories.Verb;将起作用。
| 归档时间: |
|
| 查看次数: |
857 次 |
| 最近记录: |