2016-07-23 6 views
3

「ストーリー」全体は、XAMLのすべてを構成できるだけのものです。私はObjectDataProvider(ODP)メソッドにパラメータ(私のアプリケーションクラスからの変数)を渡そうとしています。そのアイデアは、マークアップ拡張を使用することでした。実行時にはすべてが完璧に機能し、拡張機能はこのパラメータをODPに返します。設計時には機能しませんでした。マークアップ拡張機能は設計時に使用できませんか?設計時に間に合わないかどうかを確認する方法はありますか?マークアップ拡張の異常な動作。デザインモードでは機能しませんか?

拡張子:

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たObjectDataProvider:

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

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

結合は、設計時にdidntの仕事:

<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拡張が機能すること:

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

マークアップが禁止されている場合/何とかMethodParameterする任意の変数を渡す方法がどうなるか、設計時に無効になって?

ご協力いただければ幸いです。 GetKalenderを追加するための

編集:リストボックスの結合にStaticResourceにDinamicResourceを変更するために編集

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)); 
} 

答えて

0

MarkupExtensionがDesignerモードで使用されているかどうかを確認するにはどうすればよいですか?

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"; 
    } 

メソッドにパラメータとしてMarkupExtensionを使用する方法を克服するにはどうすればよいですか?

上記の方法では、デザイナーモードの間にString.Emptyまたはnullの何かを戻してください。そして、呼び出されたメソッドのstrConnectionStringの値を確認し、単にnullを返します。 ItemsSourceはnullとなり、例外はスローされません。

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

ありがとう:

はあなたのGetKalender方法の変更を提案しました。今私は非UI要素にあるdesgnステータスを取得する方法を知っています。主な問題まで - 設計時にこのバインディングがなぜ機能しなかったのか理解できません。 PS:編集されたトピックスターター - GetKalenderが追加されました。 – AndrewZ

+0

他の従来のメソッド(拡張子なし)があるオブジェクトから静的プロパティをObjectDataProviderのパラメーターとして渡すことができますか?私はそれがどのように拡張機能とテーブルを買う可能性の拡張で行うことができるのが好きです - しかし、これが確実に動作する場合のみ: – AndrewZ

+0

Anjum、命題に感謝します。しかし、exeption私の問題が欲しい - 問題は、設計時に呼ばれた拡張wasntだった。設計モードで何かが悪い解決策であるかどうかをどこからでも確認することで克服します(少なくとも私にとって)。この時点で私はクリーンなXAMLを生成し、設計時にいくつかのデータを見ることができるようにする必要があります。この拡張機能(およびODPのパラメータ)は、私の設定に基づいて異なるデータベース接続を表示するためのものでした。これはApp.configやconsortとは関係ありません。とにかく、この拡張が設計時に呼び出されたのではなく、むしろ実行時にその奇妙なこと。 – AndrewZ

関連する問題