سؤال

أنا أحاول ربط إخراج الطريقة. الآن رأيت أمثلة على هذا باستخدام 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]}" />
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top