绑定到UWP ComboBox时无法设置ViewModel属性
在UWP / Template10应用程序中,我们有一个绑定到ViewModel属性的组合框。 ViewModel属性的值在OnNavigatedToAsync中设置。 如果我们删除了ComboBox绑定,ViewModel中的属性被适当设置。 但是,如果ComboBox绑定到该属性,则ViewModel属性将保留为空。
XAML看起来像这样
<ComboBox
Name="JobTypeComboBox"
ItemsSource="{x:Bind JobViewModel.JobTypes}"
SelectedItem="{x:Bind JobViewModel.JobType,Mode=TwoWay,Converter={StaticResource ChangeTypeConverter}}"/>
ViewModel看起来像这样
JobType _JobType = default(JobType);
public JobType JobType { get { return _JobType; } set { Set(ref _JobType, value); } }
public ObservableCollection<JobType> JobTypes = new ObservableCollection<JobType>(JobTypeService.GetJobTypes());
public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> state)
{
this.JobType = job.JobType;
编辑1:转换器看起来像这样
public class ChangeTypeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
if (targetType.IsConstructedGenericType && targetType.GetGenericTypeDefinition().Equals(typeof(Nullable<>)))
{
if (value == null)
{
return null;
}
targetType = Nullable.GetUnderlyingType(targetType);
}
if (value == null && targetType.GetTypeInfo().IsValueType)
return Activator.CreateInstance(targetType);
if (targetType.IsInstanceOfType(value))
return value;
return System.Convert.ChangeType(value, targetType);
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return Convert(value, targetType, parameter, language);
}
}
在执行该行this.JobType = job.JobType;
有6个电话给转换器:
用JobType的正确值调用Convert并返回正确的值。
使用value = null调用ConvertBack并返回null;
使用value = null调用Convert并返回null;
使用value = null调用Convert并返回null;
使用value = null调用ConvertBack并返回null;
使用value = null调用Convert并返回null;
因此,它看起来像绑定弹起的价值回到ConvertBack为空。
Job.JobType
被正确返回。 如果绑定已从JobTypeComboBox
删除,则this.jobType
设置正确。 当绑定被添加到JobTypeComboBox
, this.JobType
保持为空。
当JobTypeComboBox
绑定到它时,如何设置this.jobType
的值?
那么,使用这个视图模型:
public class MainPageViewModel : ViewModelBase
{
public MainPageViewModel()
{
ComboBoxItem = ComboBoxItems.First();
}
string _ComboBoxItem = default(string);
public string ComboBoxItem { get { return _ComboBoxItem; } set { Set(ref _ComboBoxItem, value); } }
public ObservableCollection<string> ComboBoxItems { get; } = new ObservableCollection<string>(new[] { "1", "2", "3", "4" });
}
而这个XAML:
<ComboBox x:Name="testComboBox"
ItemsSource="{Binding ComboBoxItems}"
RelativePanel.AlignLeftWith="parameterResizer"
RelativePanel.Below="stateTextBox"
SelectedItem="{Binding ComboBoxItem, Mode=TwoWay}" />
<TextBlock x:Name="testTextBlock"
RelativePanel.AlignLeftWith="parameterResizer"
RelativePanel.Below="testComboBox"
Text="{Binding ComboBoxItem}" />
我得到了这个发生:
感谢您使用Template 10 - 尽管我认为这与T10无关。 :-)
链接地址: http://www.djcxy.com/p/44683.html上一篇: Unable to set ViewModel property when bound to UWP ComboBox
下一篇: Bind flag enums to a control and back to the enum property