2011-02-16 10 views
0

XmlDataProviderをSource属性で別の形式の静的関数にバインドしようとしています。XmlDataProviderソース属性を別の形式の静的関数にバインドしますか?

ここにXmlDataProviderラインだ - 私はそれが呼び出される静的な関数にバインドされるためにソース属性の希望

<XmlDataProvider x:Key="Lang" Source="/lang/english.xml" XPath="Language/MainWindow"/> 

:「設定」高度で

おかげで、

:と呼ばれる形で「GetValue_UILanguage」

Din。

答えて

1

メソッドにバインドできるコンバータ用のthis question'sanswerを参照してください。

おそらくそれを変更して、どのクラスの静的メソッドにもアクセスできるようにすることができます。

編集:ここでは、リフレクションを介してメソッドを見つけるはずの変更されたコンバータを示します。

(注:あなたが実際に任意の値を結合しないように、代わりにmarkup extensionを使用したほうが良いでしょう。)

public sealed class StaticMethodToValueConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     try 
     { 
      var methodPath = (parameter as string).Split('.'); 
      if (methodPath.Length < 2) return DependencyProperty.UnsetValue; 

      string methodName = methodPath.Last(); 

      var fullClassPath = new List<string>(methodPath); 
      fullClassPath.RemoveAt(methodPath.Length - 1); 
      Type targetClass = Assembly.GetExecutingAssembly().GetType(String.Join(".", fullClassPath)); 

      var methodInfo = targetClass.GetMethod(methodName, new Type[0]); 
      if (methodInfo == null) 
       return value; 
      return methodInfo.Invoke(null, null); 
     } 
     catch (Exception) 
     { 
      return DependencyProperty.UnsetValue; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) 
    { 
     throw new NotSupportedException("MethodToValueConverter can only be used for one way conversion."); 
    } 
} 

使用方法:Appで

<Window.Resources> 
    ... 
    <local:StaticMethodToValueConverter x:Key="MethodToValueConverter"/> 
    ... 
</Window.Resources> 

... 

<ListView ItemsSource="{Binding Converter={StaticResource MethodToValueConverter}, ConverterParameter=Test.App.GetEmps}"> 
... 

方法クラス:

namespace Test 
{ 
    public partial class App : Application 
    { 
     public static Employee[] GetEmps() {...} 
    } 
} 

私はこれをテストしました。 orksの場合は、フルクラスパスを使用することが重要ですが、App.GetEmpsだけでは機能しませんでした。

+0

静的関数でない場合、静的変数から値を取ることは可能ですか?どうやって? – dinbrca

+0

これは '{x:Static namespace:SomeClass.StaticProperty}'を使用することができます。 –

+0

私はすでにそれを試みていますが、プログラムを起動するとバグ報告が出ます。 私はxmlns:local = "clr-namespace:Visual_Command_Line"を名前空間として追加しました。 と私のコード: dinbrca

関連する問題