2016-07-23 6 views
3

Die ganze "Geschichte" nur um alles in XAML konfigurieren zu können. Ich versuche, Parameter (Variable aus meiner Application-Klasse) an ObjectDataProvider (ODP) -Methode übergeben. Die Idee war, Markup-Erweiterung zu verwenden. Jetzt läuft zur Laufzeit alles einwandfrei und die Erweiterung gibt diesen Parameter für ODP zurück. Zur Entwurfszeit hat es nicht funktioniert. Sind Markup-Erweiterungen zur Entwurfszeit nicht verwendbar? Gibt es eine Möglichkeit zu überprüfen, ob sie fällige Entwurfszeit genannt werden?Seltsames Verhalten der Markup-Erweiterung. Funktioniert es nicht im Entwurfsmodus?

Erweiterung:

namespace ZApplication 
{ 
    public class ZAppExtension : MarkupExtension 
    { 
     public ZAppExtension() { } 
     public override object ProvideValue(IServiceProvider serviceProvider) 
     { 
      MessageBox.Show("ProvideValue called"); 
      return @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=TermineDB;Integrated Security=True;Persist Security Info=True"; 
     } 
    } 
} 

XAML Object:

<ObjectDataProvider x:Key="objKalender" 
         MethodName="GetKalender" 
         ObjectType="{x:Type zzzDataLayer:TermineAPI}"> 

     <ObjectDataProvider.MethodParameters> 
      <z:ZAppExtension></z:ZAppExtension> 
     </ObjectDataProvider.MethodParameters> 
    </ObjectDataProvider> 

Bindung, die nicht funktioniert hat zur Entwurfszeit:

<ListBox x:Name="listBox" Height="129" Margin="19,0,18,37" VerticalAlignment="Bottom" 
     ItemsSource="{Binding Mode=OneWay, Source={StaticResource objKalender}}" 
     DisplayMemberPath="Beschreibung" SelectedValuePath="Id" 
     SelectedIndex="2" SelectedValue="{Binding PrimaryCalendarId}" BorderThickness="1"/> 

proove dass Erweiterung funktioniert:

<TextBlock x:Name="textBlock1" HorizontalAlignment="Right" Margin="0,210,42,190" TextWrapping="Wrap" Text="{z:ZApp}" Width="247"/> 

Wenn Markups nicht zulässig sind/irgendwie zur Entwurfszeit deaktiviert, was ein Weg sein, wird jede Variable zu übergeben MethodParameter?

Jede Hilfe wird geschätzt.

bearbeiten für das Hinzufügen von GetKalender:

public static IEnumerable<Kalender> GetKalender(String strConnectionString=null) 
{ 
    zEntityContext.zDataContext dc; 
    if (String.IsNullOrEmpty(strConnectionString)) 
     dc = new zEntityContext.zDataContext(); 
    else 
     dc = new zEntityContext.zDataContext(strConnectionString); 

    return dc.Kalendere.Select(kalender => new Kalender(kalender, dc)); 
} 

bearbeitet für DinamicResource zu Static in Bindung von List-Box zu ändern.

Antwort

0

Wie überprüfen Sie, ob Ihre MarkupExtension im Designer-Modus verwendet wird?

public override object ProvideValue(IServiceProvider serviceProvider) 
    { 
     IProvideValueTarget ipvt = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget)); 
     if (ipvt.TargetObject is DependencyObject && System.ComponentModel.DesignerProperties.GetIsInDesignMode((DependencyObject)ipvt.TargetObject) == true) 
       return "No designer mode please !"; 

     MessageBox.Show("ProvideValue called while running !"); 
     return @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=TermineDB;Integrated Security=True;Persist Security Info=True"; 
    } 

Wie Überwindung der Verwendung von MarkupExtension als Parameter zu einer Methode?

In der obigen Vorgehensweise, geben Sie etwas anderes zurück, das String.Empty oder null sein könnte, während im Designer-Modus. Und dann überprüfen Sie den Wert strConnectionString in der aufgerufenen Methode und einfach null zurückgeben. ItemsSource erhält null und keine Ausnahme wird ausgelöst.

vorgeschlagene Änderung in Ihrer GetKalender Methode:

if (String.IsNullOrEmpty(strConnectionString)) 
     return null; 
+0

Danke. Jetzt weiß ich, wie man den DESGN-Status in einem Nicht-UI-Element findet. Bis zum Hauptproblem - immer noch kann ich nicht verstehen, warum diese Bindung zur Designzeit nicht funktioniert hat. PS: Bearbeiteter Themenstarter - GetKalender hinzugefügt. – AndrewZ

+0

Gibt es andere konventionelle Methoden (ohne Erweiterung), die es mir erlauben, statische Eigenschaft von einem Objekt als Parameter an ObjectDataProvider zu übergeben? Ich mag es, wie es mit Erweiterungs- und Erweiterungsmöglichkeit zu Tisch gemacht werden könnte - aber nur wenn das zuverlässig funktioniert :) – AndrewZ

+0

Anjum, danke für den Vorschlag. Aber Ausnahme will mein Problem - Problem war Erweiterung wurde nicht zur Entwurfszeit aufgerufen. Überwindung durch Überprüfung überall, wenn etwas im Design-Modus eine schlechte Lösung ist (für mich zumindest). In diesem Moment muss ich sauberes XAML produzieren und einige Daten in der Entwurfszeit sehen. Diese Erweiterung (und der Parameter für ODP) sollte verschiedene Datenbankverbindungen basierend auf meiner Konfiguration zeigen. Dies hat nichts mit App.config und Consorts zu tun.Wie auch immer, es ist seltsam, dass diese Erweiterung nicht zur Designzeit aufgerufen hat, sondern zur Laufzeit. – AndrewZ