2016-07-03 16 views
1

Problem ist mit Eigenschaft Init/Einstellung. Problem tritt in UserControl auf, das von der Basisklasse abgeleitet ist (in der are-Eigenschaften definiert sind). UserControl besteht aus einem Textfeld und einer Geschäftslogik, die in der Basisklasse definiert ist.WPF-Property-Set-Reihenfolge in benutzerdefinierten XAML und UserControl-Basisklasse

VariableName-Eigenschaft in Setter-Aufrufmethoden, die die VariableType-Eigenschaft aus derselben Basisklasse verwendet.

Problem tritt auf, wenn VariableName zuerst in XAML definiert ist. Ich muss sicherstellen, dass VariableType Wert vor VariableName erhält.

public Enums.Types VariableType 
{ 
    get 
    { 
     return _variableType; 
    } 
    set 
    { 
     _variableType = value; 
     if (!string.IsNullOrEmpty(_variableName) && Type == null) 
      SetType(); 
    } 
} 
public string VariableName 
{ 
    get { return _variableName; } 
    set 
    { 
     _variableName = value; 
     if (!string.IsNullOrEmpty(_variableName) && Type == null) 
      SetType(); 
    } 
} 
private void SetType() 
{ 
    if (Vars == null) 
     PopulateVars(); 
    if (VariableType != Enums.Types.Default) 
    { 
     Type = Types.SetOveridenType(VariableType); 
    } 

} 

And XAML:

<Window 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
xmlns:local="clr-namespace:TestShell" 
xmlns:Controls="clr-namespace:Controls.Controls;assembly=Controls" x:Class="TestShell.MainWindow" 
mc:Ignorable="d" 
Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <Controls:Numeric HorizontalAlignment="Left" Margin="186,37,0,0" VerticalAlignment="Top" Height="40" Width="111" VariableName="SomeName" VariableType="Int16"/> 
</Grid> 

Antwort

0

I must ensure that VariableType gets value before VariableName.

I think you're assuming the value must always be set first. There are some cases in which you want to stop this operation if value is invalid. Might I suggest adding an additional check in set implementation of VariableName?

Das heißt, anstatt den Satz sofort auszuführen, prüfen Sie, ob VariableType bereits gesetzt ist. Wenn ja, setze VariableName, dann mach deine Sachen. Ansonsten bleibt der Wert unverändert. Ich habe bemerkt, wenn dies passiert und die Daten an eine TextBox gebunden sind, wird die TextBox rot umrandet, bis ein gültiger Wert gesetzt ist.

Hier ist, was Ihr Code soll wie folgt aussehen:

public string VariableName 
{ 
    get { return _variableName; } 
    set 
    { 
     //I put both conditions here because I forgot, which is 
     //the correct way for checking if an enum value is null, 
     //though, my gut's telling me it's the first you'll want 
     //to stick with. 
     if (VariableType == default(Enums.Types) || VariableType == null) 
      return; 
     //VariableType is definitely not null so it's okay to do stuff. 
     _variableName = value; 
    } 
} 

Tbh, Ihr Code war relativ schwierig zu folgen, wie Sie zum ersten Mal auf dem Usercontrol den Typen setzen und dann versuchen, wieder gesetzt, wenn entweder VariableType oder VariableName Änderungen, aber nur wenn der Wert null ist.

Gibt es einen bestimmten Grund, warum VariableType anfänglich null sein muss? Ich stelle immer sicher, dass meine Enums einen Standardaufzählungswert haben, so dass ich nie überprüfen muss, ob der Wert Null ist, nur wenn es vom Standardtyp ist (was Sie in SetType tun, aber erst, nachdem überprüft wird, ob es Null ist).

Ohne die Geschäftslogik zu kennen, wäre es schwierig, weitere Vorschläge zu machen.

+0

Hallo, vielen Dank für die Antwort. Es ist so. VariableType ist eine Enumeration ohne NULL-Werte, und der Wert ist immer standardmäßig am Anfang. Typ auf der anderen Seite ist vom Typ Typ :). Benutzer des Steuerelements kann den Variablentyp über die Enumeration in der Entwurfszeit ändern, oder der Wert wird in Runtime dynamisch festgelegt. Problem ist, wenn VariableName vor enum VariableType gesetzt ist, denn dann habe ich falsche Default-Wert, zum Beispiel Int32. –

+0

Wie auch immer, ich löste das, indem ich die Methode Typ eingab, die die Kontrolle initialisiert. Ich bin mir sicher, dass alle Requisiten initialisiert sind. –