2017-12-11 14 views
1

Ich habe festgestellt, dass ähnliche Fragen schon einmal gestellt wurden, aber ich habe keine detaillierten Beispiele gefunden.Wie verwendet man die Abhängigkeitseigenschaft, um den Parameter im Konstruktor eines Benutzersteuerelements zu ersetzen?

Ich habe ein winform Programm, hat seinen Konstruktor einen Parameter cn:

public AddFailure(ProSimConnect cn)// constructor in winform 
    { 
     this.connection = cn; 
     InitializeComponent(); 
     ... 
    } 

Jetzt muss ich es in einem Usercontrol in WPF simulieren und in Mainwindow setzen.

In MainWindow.xaml:

<Border ...> 
    <IOS:Core_System/> 
    </Border> 

Ich möchte, dies zu tun, aber ich weiß, ich kann nicht, weil es keine Parameter haben sollte: Ich versuche

public Core_System(ProSimConnect cn)// constructor in UserControl 
    {    
     this.cn = connection; 
     InitializeComponent(); 
     ... 
    } 

Daher Abhängigkeit zu verwenden Eigenschaft:

public partial class Core_System : UserControl 
{ 
    ProSimConnect connection; 

    //dependency property 
    public ProSimConnect cn 
    { 
     get { return (ProSimConnect) GetValue(connectionProperty); } 
     set { SetValue(connectionProperty, value); } 
    } 
    public static readonly DependencyProperty connectionProperty = 
     DependencyProperty.Register("cn", typeof(ProSimConnect),typeof(Core_System)); 

    // constructor in UserControl 
    public Core_System() 
    {    
     this.connection = cn; 
     InitializeComponent(); 
     ... 
    } 
     ... 
} 

Es funktioniert nicht - es meldet "Null" Ausnahme. Wo liege ich falsch? Vielen Dank.

Dies ist die Funktion, die die Parameter im Konstruktor des Usercontrol verwenden müssen:

Failure []getSelectedFailures() 
    { 
     return cn.getFailures().Where(failure => failure_name.Contains(failure.name)).ToArray(); 
    } 

Die Lage Ich nenne es ist:

public partial class Core_System : UserControl 
{ 
    ... 
    private void button_Engine_1_On_Fire(object sender, RoutedEventArgs e) 
    { 
     ... 
     ArmedFailure.create(getSelectedFailures()); 
    } 
} 
+0

Eine Abhängigkeitseigenschaft kann nicht festgelegt werden, bevor der Konstruktor zurückgegeben wurde ... – mm8

+0

Hi @ mm8, meinst du ich muss es nach dem Konstruktor setzen? – water

+0

Sie können jeden Code, der ProSimConnect verwendet, vom Konstruktor des UserControls in einen Callback für Abhängigkeitseigenschaften verschieben. Siehe meine Antwort. – mm8

Antwort

1

Eine Abhängigkeitseigenschaft nicht vor dem festgelegt werden kann Konstruktor ist zurückgekehrt.

Sie können beliebigen Code bewegen, die ProSimConnect vom Konstruktor der UserControl zu einer Abhängigkeitseigenschaft Callback verwendet:

public partial class Core_System : UserControl 
{ 
    ProSimConnect connection; 

    //dependency property 
    public ProSimConnect cn 
    { 
     get { return (ProSimConnect)GetValue(connectionProperty); } 
     set { SetValue(connectionProperty, value); } 
    } 
    public static readonly DependencyProperty connectionProperty = 
     DependencyProperty.Register("cn", typeof(ProSimConnect), typeof(Core_System), new PropertyMetadata(new PropertyChangedCallback(OnPropertySet)); 

    private static void OnPropertySet(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     Core_System ctrl = d as Core_System; 
     ctrl.connection = e.NewValue as ProSimConnect; 
     //... 
    } 

    // constructor in UserControl 
    public Core_System() 
    { 
     InitializeComponent(); 
    } 
} 

Der Rückruf aufgerufen wird, wenn die Abhängigkeitseigenschaft auf einen Wert festgelegt ist.

+0

Danke. Ich habe meine Frage bearbeitet. In der OnPropertySet-Funktion fügten Sie für mich die Auslassungen hinzu, die ich "return cn.getFailures() einfügen soll. Wo (failure => failure_name.Contains (failure.name)). ToArray();" und ändere den Funktionstyp von "void" zu "Failure []"? Entschuldigung, ich verwende niemals zuvor die Abhängigkeitseigenschaft. – water

+0

Wo rufst du getSelectedFailures() an? – mm8

+0

Hallo, ich rufe es in der Klasse core_system - entsprechende .xaml.cs des UserControl XAML. Ich habe es in meiner Frage hinzugefügt. Vielen Dank. @ mm8 – water

Verwandte Themen