В приложении UWP/Template10 у нас есть ComboBox, связанный с свойством ViewModel. Значение свойства ViewModel устанавливается в OnNavigatedToAsync. Если мы удалим привязку ComboBox, свойство в ViewModel будет установлено соответствующим образом. Но если ComboBox привязан к свойству, свойство ViewModel остается равным нулю.Невозможно установить свойство ViewModel при привязке к UWP ComboBox
Часть 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;
EDIT 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 и возвращает правильное значение.
ConvertBack вызывается со значением = null и возвращает null;
Convert вызывается со значением = null и возвращает null;
Convert вызывается со значением = null и возвращает null;
ConvertBack вызывается со значением = null и возвращает null;
Convert вызывается со значением = null и возвращает null;
Так что похоже, что привязка возвращает значение обратно в ConvertBack как null.
Job.JobType
верен правильно. Если привязка удалена с JobTypeComboBox
, this.jobType
настроен правильно. Когда привязка добавляется к JobTypeComboBox
, this.JobType
остается нулевым.
Как установить значение this.jobType
, когда JobTypeComboBox
привязан к нему?
1. является элементом job.JobType из коллекции, привязанной к ItemsSource? Надеюсь, вы знаете, что он установлен только в Mode = OneTime только по умолчанию? 2. Что относительно ChangeTypeConverter? вы пытались проникнуть в него и посмотреть, что там происходит? – RTDev
@RTDev ItemsSource для JobTypeComboBox является ObservableCollection JobTypes. Mode = TwoWay. job.JobType не привязан к ItemsSource. JobTypeComboBox привязан к ItemSource. ChangeTypeConverter - это шаблон Template10. Он возвращает целевой тип отправителя.Если я удалю ChangeTypeConverter из задания привязки. JOBType установлен правильно. Мне нужен ChangeTypeConverter, поскольку JobTypeComboBox привязан к JobType, а не к строке. –
Vague
если я правильно вас понял - проблема с вашим конвертером. Попытайтесь изменить его с помощью этой подделки (она делает не больше, чем просто притворяется covnerterter, который делает что-либо, но не делает этого, но делает компиляцию xaml): public class ObjectToObject: IValueConverter { public object Convert (значение объекта, Тип targetType , параметр объекта, строковый язык) { возвращаемое значение; } общественный объект ConvertBack (значение объекта, тип targetType, параметр объекта, строковый язык) { return value; }} – RTDev