2016-07-31 4 views
0

Nehmen wir an, ich habe eine Schnittstelle namens ICar und es wird von zwei Klassen implementiert; BMW und Audi. Sie enthalten den Namen und den Inhalt (Visualisierung des Autos). Ich möchte die Namen "BMW" und "Audi" erhalten und in Combo Box auflisten. Sobald der Benutzer den Namen auswählt, sollte der Objektinhalt angezeigt werden. Das was ich bisher gemacht habe.Wie erhalte ich eine Liste von Objekten, die dieselbe Schnittstelle erben?

interface ICar{ 
    String Name {get;} 
    object Content{get;} 
} 

Es wird von zwei Klassen geerbt, Audi und BMW.

class Audi : ICar{ 
    AudiCar audi = new AudiCar(); 

    String Name{get {return"Audi";}} 
    object Content{get {return audi;}} 
} 


class BMW : ICar{ 
    BMWCar bmw = new BMWCar(); 

    String Name{get {return"BMW";}} 
    object Content{get {return bmw;}} 
} 

BMWCar und AudiCar haben die Visualisierung von BMW und Audi Auto.

In MainModel Klasse,

Class MainModel{ 
    List<ICar> cars; 
    ICar selectedCar; 

    MainModel(IEnumerable<ICar> cars){ 
     this.cars = new List<ICar>(cars); 
     this.selectedCar = this.cars.FirstOrDefault(); 
    } 

    IList<ICar> Cars {get{return this.cars;}} 

    public object Car{ 
     get{ return this.selectedCar.Content;} 
    } 
} 

Im XAML,

xmlns:local="clr-namespace:WpfApplication1" 

<ComboBox ItemsSource="{Binding Cars}" DisplayMemberPath="Name" SelectedItem="{Binding SelectedCar, Mode=TwoWay}" /> 

Aber ich bin nicht die beiden Werte "Audi" und "BMW" in der Combo-Box zu bekommen. Bitte sag, ob ich etwas falsch gemacht habe.

+2

Sie wissen nicht über die Antwort, aber ich bin nicht sicher, dass Sie Felder innerhalb einer Schnittstelle (C# 5?) Bereitstellen können, so die beste Praxis zuerst ist, eine abstrakte Klasse namens Auto zu haben. –

+0

Hinweis: Verwenden Sie auch eine Schnittstelle für den Inhalt –

+0

@OriRefael C# Schnittstellen erlauben die Definition von Eigenschaften. Ref: http://stackoverflow.com/questions/3754274/interface-class-with-getter-and-setter-in-c-sharp – Giggity

Antwort

0

Um eine Liste der Klassen zu erhalten, die eine Schnittstelle implementieren:

  • Bestimmen Sie, welche Baugruppe Sie für Typen suchen in gehst, die ICar
  • alle Typen Treten Sie in dieser Versammlung implementieren
  • Bestimmen Sie, welche dieser Typen implementieren ICar.

Hier ist ein Beispiel. Zur Demonstration suche ich nach Klassen in der gleichen Baugruppe wie die Schnittstelle (ICar).

var assembly = Assembly.GetAssembly(typeof (ICar)); 
var typesInAssembly = assembly.GetTypes(); 
var matching = typesInAssembly 
    .Where(type => typeof(ICar).IsAssignableFrom(type) && !type.IsInterface); 
// Checking !type.IsInterface or else it also returns ICar. 
0

Verwenden Sie observableCollection anstelle von List.

Class MainModel{ 
    List<ICar> cars; 
    ICar selectedCar; 

    ShowData(IEnumerable<ICar> cars){ 
     foreach (var car in cars) 
      { 
       _car.Add(car); 
      } 
     this.selectedCar = this.cars.FirstOrDefault(); 
    } 

    private ObservableCollection<Car> _cars=new ObservableCollection<Car>(); 

     public ObservableCollection<Car> Cars 
     { 
      get { return _cars; } 
      set { _cars= value; } 
     } 
    public object Car{ 
     get{ return this.selectedCar.Content;} 
    } 
} 
Verwandte Themen