2016-12-20 13 views
1

В приложении 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

1. является элементом job.JobType из коллекции, привязанной к ItemsSource? Надеюсь, вы знаете, что он установлен только в Mode = OneTime только по умолчанию? 2. Что относительно ChangeTypeConverter? вы пытались проникнуть в него и посмотреть, что там происходит? – RTDev

+0

@RTDev ItemsSource для JobTypeComboBox является ObservableCollection JobTypes. Mode = TwoWay. job.JobType не привязан к ItemsSource. JobTypeComboBox привязан к ItemSource. ChangeTypeConverter - это шаблон Template10. Он возвращает целевой тип отправителя.Если я удалю ChangeTypeConverter из задания привязки. JOBType установлен правильно. Мне нужен ChangeTypeConverter, поскольку JobTypeComboBox привязан к JobType, а не к строке. – Vague

+0

если я правильно вас понял - проблема с вашим конвертером. Попытайтесь изменить его с помощью этой подделки (она делает не больше, чем просто притворяется covnerterter, который делает что-либо, но не делает этого, но делает компиляцию xaml): public class ObjectToObject: IValueConverter { public object Convert (значение объекта, Тип targetType , параметр объекта, строковый язык) { возвращаемое значение; } общественный объект ConvertBack (значение объекта, тип targetType, параметр объекта, строковый язык) { return value; }} – RTDev

ответ

0

Ну, используя этот вид-модель:

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}" /> 

я получил, чтобы это произошло:

enter image description here

Спасибо за помощью шаблона 10 - хотя я думаю, что это не имеет ничего общего с T10. :-)

+0

Устанавливает значение в 'OnNavigatedToAsync'. –

Смежные вопросы