2016-07-25 12 views
0

In meinem Projekt habe ich ein externes Paket für die Steuerung AutoCompleteTextBox (https://wpfautocomplete.codeplex.com/).Polymorphismus für externes Paket

Ich habe auch eine Bildschirmtastatur.

Immer wenn der Benutzer auf ein Textfeld klickt, ordnet die Tastatur dieses Tastaturkürzel einer Eigenschaft selbst zu, und jeder Klick auf eine Nummer fügt diese Nummer dem Textfeld hinzu.

Einige Textfelder müssen automatisch vervollständigt werden und andere müssen die übliche TextBox sein.

Das Problem hier ist, dass AutoCompleteTextBox nicht von TextBox erbt, daher kann ich nicht eine eindeutige "TextBox zuweisen" für die Tastatur. Beide Steuerelemente teilen jedoch die Eigenschaft "Text", die einzige, die ich verwenden muss.

public partial class Keypad : UserControl 
{ 
    private AutoCompleteTextBox _controlAsignado; //this should be a generic class or an interface 
    public Keypad() { } 
    public void AsignarControl(AutoCompleteTextBox control) 
    { 
     _controlAsignado = control; 
    } 
    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     Button button = sender as Button; 
     switch (button.CommandParameter.ToString()) 
      { 
      case "BACK": 
       if (_controlAsignado.Text.Length > 0) 
          _controlAsignado.Text = _controlAsignado.Text.Remove(_controlAsignado.Text.Length - 1); 
       break; 
      default: 
       _controlAsignado.Text += button.Content.ToString(); 
       break; 
      } 
    } 

}

Es wäre fantastisch, eine "ITextBox" zu haben, die beiden Kontrollen implementieren.

Ich weiß, dass ich dieses Problem mit Reflektion lösen kann, aber ich möchte eine elegante Lösung.

Horas Maquina and Orden Servicio must be "TextBox", the rest are AutoCompleteTextBox

Antwort

2

Sie können für beide Klassen einen Wrapper erstellen (vorzugsweise mit einer ITextBox Schnittstelle zu), so kann man abstrakt die Unterschiede weg und verwenden Runtime Polymorphismus:

interface ITextBox { string Text {get; set;} } 
abstract class TextWrapper<T>: ITextBox where T: Control { 
    T Wrapped; 
    TextWrapper(T textControl) { 
     this.Wrapped = textControl; 
    } 
    Text{ get{ 
     return Wrapped.Text; 
    } 
    set (string value) { 
     Wrapped.Text = value; 
    } 
} 
class TextBoxWrapper: TextWrapper<TextBox> {} 
class AutoCompleteTextBoxWrapper: TextWrapper<AutoCompleteTextBox> {} 

Ihr Code würde wie folgt aussehen dies:

public partial class Keypad : UserControl 
{ 
    private ITextBox _controlAsignado; 
    public Keypad() { } 
    public void AsignarControl(AutoCompleteTextBox control) 
    { 
     _controlAsignado = new AutoCompleteTextBoxWrapper(control); 
    } 
    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     Button button = sender as Button; 
     switch (button.CommandParameter.ToString()) 
      { 
      case "BACK": 
       if (_controlAsignado.Text.Length > 0) 
          _controlAsignado.Text = _controlAsignado.Text.Remove(_controlAsignado.Text.Length - 1); 
       break; 
      default: 
       _controlAsignado.Text += button.Content.ToString(); 
       break; 
      } 
    } 
} 

(ich den Code nicht getestet, aber ich hoffe, die allgemeine Idee ist, was Sie suchen.)