2016-12-24 101 views
1

我正在用組合框和數據網格構建wpf表單。組合框綁定到模型基類moWeek的集合。所選項目被綁定到一個叫做wm的耙類,如SelectedItem="{Binding Week, Mode=TwoWay}",而在Viewmodel類中只是vm類型的屬性。無法轉換爲基類

現在,當我從組合框中選擇一個值時,我得到一個System.NotSupportedException異常,稱爲TypeConverter無法轉換model.moWeek。

我想我需要某種從moWeek到vmWeek的轉換器,但我不知道在哪裏以及如何放置它。我將如何做到這一點?

下面是代碼:

型號一週類:

using System.Collections.ObjectModel; 

namespace Model 
{ 
    public class moWeek 
    { 

     public moWeek() 
     { 

     } 

     private int id; 

     public int Id 
     { 
      get { return id; } 
      set { id = value; } 
     } 
    } 
} 

視圖模型星期類:

using System; 
using System.ComponentModel; 
using Model; 
using ViewModel.Lists; 

namespace ViewModel.Planning 
{ 
    public class vmWeek : moWeek 
    { 
     private ProjectList projects; 

     public ProjectList Projects 
     { 
      get { return projects; } 
      set { projects = value; OnPropertyChanged(new PropertyChangedEventArgs("Projects")); } 
     } 

     private void OnPropertyChanged(PropertyChangedEventArgs propertyChangedEventArgs) 
     { 
      throw new NotImplementedException(); 
     } 
    } 
} 

視圖模型

using System.ComponentModel; 
using tegViewModel.Auswahllisten; 


namespace tegViewModel.Planning 
{ 
    public class vmPlanning : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 

     public vmPlanning() 
     { 
      Weeks = new alWeeks(); //Collection of moWeek 

     } 

     public alWeeks Weeks { get; set; } 

     private vmWeek week; 

     public vmWeek Week 
     { 
      get { return Week; } 
      set { Week = value; OnPropertyChanged(new PropertyChangedEventArgs("Week")); } 
     } 


     private void OnPropertyChanged(PropertyChangedEventArgs propertyChangedEventArgs) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) 
      { 
       handler(this, new PropertyChangedEventArgs(propertyChangedEventArgs.PropertyName)); 
      } 

     } 
    } 
} 

回答

1

首先,你需要創建一個類該實施s接口IValueConverter

[ValueConversion(typeof(moWeek), typeof(vmWeek))] 
class MoWeekToVmWeekConverter: IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     var moweek = value as moWeek; 
     vmWeek result = //Do your conversion; 
     return result; 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     return (moWeek) value; 
    } 
} 

之後,您可以在資源中聲明該類的一個實例。

<local:MoWeekToVmWeekConverter x:Key="MoWeekConverter"></local:MoWeekToVmWeekConverter> 

一旦你聲明瞭轉換器,你可以在綁定中使用它。

<ComboBox SelectedItem="{Binding Week, Mode=TwoWay, Converter={StaticResource MoWeekConverter}}"></ComboBox> 
+0

謝謝,這工作正常。順便說一句,我找到了另一種解決方案,將Weeks類型更改爲vmWeek集合,並將隱式轉換器放入alWeeks集合中。 –

+0

我想知道爲什麼你不能這麼做:),我決定把它作爲先決條件。 –

相關問題