SORU
2 ŞUBAT 2009, PAZARTESİ


WPF bir yöntem bağlama?

Nasıl WPF bu senaryoda nesneleri bir yöntem bağlamak mı?

public class RootObject
{
    public string Name { get; }

    public ObservableCollection<ChildObject> GetChildren() {...}
}

public class ChildObject
{
    public string Name { get; }
}

XAML:

<TreeView ItemsSource="some list of RootObjects">
    <TreeView.Resources>
        <HierarchicalDataTemplate DataType="{x:Type data:RootObject}" 
                                  ItemsSource="???">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
        <HierarchicalDataTemplate DataType="{x:Type data:ChildObject}">
            <TextBlock Text="{Binding Path=Name}" />
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

Burada ağaç RootObject Her GetChildren yöntem bağlamak istiyorum.

EDİTBağlama için ObjectDataProvider çalışmıyor gibi olduğum için bağlayıcı bir liste öğeleri, ve ObjectDataProvider ihtiyaç ya da statik bir yöntem veya oluşturur kendi örneği ve kullanır.

Örneğin, Matt kullanarak aldığım cevap:

Sistem.Windows.Veri Hatası: 33 : ObjectDataProvider nesne oluşturulamıyor; Type='; Hata=' yapıcı. Yanlış parametre'' RootObject

Sistem.Windows.Veri Hatası: 34 : ObjectDataProvider: türü Başarısızlık bir yöntemi çağırmak için çalışıyor; Yöntem='; Type='''; Hata='belirtilen üye hedef başlatılamaz.' RootObject GetChildren TargetException:'Sistem.Yansıma.Yöntem bir hedef gerektirir statik Olmayan. TargetException:

CEVAP
10 Mayıs 2009, Pazar


Sizin için işe yarayabilecek başka bir yaklaşım bu gibi kullanılabilecek bir parametre olarak bir yöntem adı alan bir özel IValueConverter oluşturmak için:

ItemsSource="{Binding 
    Converter={StaticResource MethodToValueConverter},
    ConverterParameter='GetChildren'}"

Bu dönüştürücü bulmak ve bu yöntemi kullanarak yansıma çağır. Bu yöntemi herhangi bir tartışma olmaması gerekir.

İşte böyle bir dönüştürücü kaynak örneği:

public sealed class MethodToValueConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var methodName = parameter as string;
        if (value==null || methodName==null)
            return value;
        var methodInfo = value.GetType().GetMethod(methodName, new Type[0]);
        if (methodInfo==null)
            return value;
        return methodInfo.Invoke(value, new object[0]);
    }

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

Ve ilgili birim testi:

[Test]
public void Convert()
{
    var converter = new MethodToValueConverter();
    Assert.AreEqual("1234", converter.Convert(1234, typeof(string), "ToString", null));
    Assert.AreEqual("ABCD", converter.Convert(" ABCD ", typeof(string), "Trim", null));

    Assert.IsNull(converter.Convert(null, typeof(string), "ToString", null));

    Assert.AreEqual("Pineapple", converter.Convert("Pineapple", typeof(string), "InvalidMethodName", null));
}

Bu dönüştürücü targetType parametre zorlamaz unutmayın.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • DominicFear

    DominicFear

    30 Kasım 2006
  • GenTechPC

    GenTechPC

    1 Temmuz 2007
  • HowcastSportsFitness

    HowcastSport

    11 Mayıs 2011