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

  • Chanre Joubert

    Chanre Joube

    27 Temmuz 2012
  • kalabrandmusic

    kalabrandmus

    25 Kasım 2009
  • Marques Brownlee

    Marques Brow

    21 Mart 2008