2013-05-26 4 views
0

Я использую WPF с MVVM. Проблема в том, что у меня есть класс модели. Person содержит три свойства PersonID, Name, Job. Модель просмотра содержит класс Person. В представлении содержится ComboBox для Job, и я ввел значения staticaly в XAML, используя ComboBoxItem say Engineer, Lawyer, Doctor: теперь мне нужно поле со списком, которое привязано к объекту Person.Job, чтобы отобразить работу человека, когда на дисплее отображается определенное лицо и возможность ввода/изменения задания и нового значения, которое должно быть передано человеку (т. е. я хочу использовать поле со списком, подобное этому в формах MS Access) Заранее спасибо. здесь XAML код ComboBoxWPF Combo Box получить и установить данные

<ComboBox ItemsSource="{Binding Person, UpdateSourceTrigger=PropertyChanged}" 
    SelectedValue="{Binding Path=Job, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    SelectedValuePath="PersonID" 
    SelectedItem="{Binding Person.Job, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" 
    Width="50" Height="20" 
    Grid.Row="1" Grid.Column="2" 
    HorizontalAlignment="Left"> 
    <ComboBoxItem Content="Engineer"/> 
    <ComboBoxItem Content="Lawyer"/> 
    <ComboBoxItem Content="Doctor"/> 
</ComboBox> 

Отображается Работа правильно в поле со списком, но при сохранении нового или измененного значения я получаю «System.Windows.Controls.ComboBoxItem: инженер» в базе данных, как исправить это. Thanks

ответ

3

Предполагая, что Person.Job является string, не имеет идентификатора, и вы хотите сохранить список заданий статического попробовать настройки вашего ComboBox так:

<ComboBox SelectedItem="{Binding Path=Job, Mode=TwoWay}"> 
    <ComboBox.ItemsSource> 
     <x:Array Type="sys:String" xmlns:sys="clr-namespace:System;assembly=mscorlib"> 
      <sys:String>Engineer</sys:String> 
      <sys:String>Lawyer</sys:String> 
      <sys:String>Doctor</sys:String> 
     </x:Array> 
    </ComboBox.ItemsSource> 
</ComboBox> 

Проблема в вашем случае является то, что вы ваш Job является a string и вы определяете ComboBox как ComboBoxItem, что означает, что SelectedItem будет иметь тип ComboBoxItem, и при выборе одного из них WPF делает конвертирование, которое в этом случае означает вызов ToString(), следовательно ваши данные. В приведенном выше примере вы установите ItemsSource на массив строк, которые обертывают WPF в ComboBoxItem для презентации, но SelectedItem будет носить string типа

+0

Да, ComboBox теперь работает, как задумано, благодаря – Hussein

+0

: Еще один помощь: как использовать проверку с таким выпадающим использованием SelectedItem, я пытался, но проверка не работает , – Hussein

+0

Что вы хотите достичь? – dkozl

0

Уведомлять об изменении привязки в поле со списком при изменении уведомления о лице.

PS Было бы проще ответить кодом.

0

Вы можете обрабатывать статическое связывание с помощью этого метода легко

Xaml Код

<ComboBox HorizontalAlignment="Left" VerticalAlignment="Top" SelectedItem="{Binding PaymentType}" Width="150" Grid.Column="1" Margin="50,4,0,0" Grid.Row="9"> 
       <ComboBox.Items> 
        <ComboBoxItem Content="Cash Payment" /> 
        <ComboBoxItem Content="Cheque Payment" />     
       </ComboBox.Items> 
</ComboBox> 

Просмотр кода модели

private System.Windows.Controls.ComboBoxItem _PaymentType; 
    public System.Windows.Controls.ComboBoxItem PaymentType 
    { 
       get 
       { 
        return _PaymentType; 
       } 
       set 
       { 
        _PaymentType = value; 
        RaisedPropertyChanged("PaymentType"); 
       } 
    } 

Теперь вы можете использовать переменную PaymentType в

string output = PaymentType.Content.ToString();