3

「ストーリー」全体は、XAML ですべてを構成できるようにするためのものです。パラメーター (Application クラスの変数) を 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>

設計時に機能しなかったバインディング:

<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"/>

拡張機能が機能することを証明します。

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

設計時にマークアップが許可されていない/何らかの形で無効になっている場合、変数を MethodParameter に渡す方法は何ですか?

どんな助けでも大歓迎です。

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

ListBoxのバインディングでDynamicResourceをStaticResourceに変更するために編集。

4

1 に答える 1

0

MarkupExtension がデザイナー モードで使用されているかどうかを確認する方法は?

 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され、例外はスローされません。

メソッドの変更案GetKalender:

if (String.IsNullOrEmpty(strConnectionString))
        return null;
于 2016-07-24T07:52:22.900 に答える