WPF XAML استدعاء طريقة على الكائن الحالي
-
03-10-2019 - |
سؤال
أنا أحاول ربط إخراج الطريقة. الآن رأيت أمثلة على هذا باستخدام ObjectDataProvider
ومع ذلك ، فإن المشكلة في هذا هي ObjectDataprovider تنشئ مثيلًا جديدًا للكائن لاستدعاء الطريقة. حيث أحتاج إلى الطريقة المسمى على مثيل الكائن الحالي. أحاول حاليًا الحصول على محول للعمل.
اقامة:
Class Entity
{
private Dictionary<String, Object> properties;
public object getProperty(string property)
{
//error checking and what not performed here
return this.properties[property];
}
}
محاولتي في XAML
<local:PropertyConverter x:Key="myPropertyConverter"/>
<TextBlock Name="textBox2">
<TextBlock.Text>
<MultiBinding Converter="{StaticResource myPropertyConverter}"
ConverterParameter="Image" >
<Binding Path="RelativeSource.Self" /> <!--this doesnt work-->
</MultiBinding>
</TextBlock.Text>
</TextBlock>
الكود وراء
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
string param = (string)parameter;
var methodInfo = values[0].GetType().GetMethod("getProperty", new Type[0]);
if (methodInfo == null)
return null;
return methodInfo.Invoke(values[0], new string[] { param });
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotSupportedException("PropertyConverter can only be used for one way conversion.");
}
مشكلتي هي أنني لا أستطيع أن أجتاز الكيان الحالي إلى المحول. لذلك عندما أحاول استخدام التفكير للحصول على طريقة getProperty ليس لدي ما أعمل عليه
شكرا ، ستيف
المحلول
قم بلف المكالمة إلى الطريقة داخل خاصية GET وأضف هذه الخاصية GET إلى أي فئة هي datacontext الحالية.
تحرير: الإجابة على سؤالك المحدث.
إذا قمت بتمرير معلمة واحدة فقط إلى ValueConverter ، فأنت لا تحتاج إلى multivalueConverter ، فما عليك سوى استخدام ValueConverter منتظم (تنفيذ IvalueConverter). أيضًا ، لماذا لا تلقي الكائن في ValueConverter إلى موحد واستخدامه مباشرة بدلاً من استخدام الانعكاس.
لتمرير DataContext الحالي باعتباره ملزمة تفعل هذا: <Binding . />
. أظن أن datacontext من textblock هو الكيان.
ومع ذلك ، كل هذا ليس ضروريًا إذا كان كل ما تريد القيام به هو تشغيل بعض التعليمات البرمجية قبل الوصول إلى عنصر القاموس. ما عليك سوى استخدام خاصية فهرس بدلاً من ذلك ، يمكنك البيانات مباشرة إليها:
public class Entity
{
private Dictionary<String, Object> properties;
public object this[string property]
{
get
{
//error checking and what not performed here
return properties[property];
}
}
}
<TextBlock Text="{Binding Path=[Image]}" />