سؤال

هل هناك طريقة للقيام المقارنة على نوع الكائن لالزناد؟

<DataTrigger Binding="{Binding SelectedItem}" Value="SelectedItem's Type">
</DataTrigger>

والخلفية: لدي شريط أدوات وأريد أن إخفاء الزر اعتمادا على ما فرعية تم تعيينها حاليا إلى كائن العنصر المحدد

.

والشكر

هل كانت مفيدة؟

المحلول

لماذا لا مجرد استخدام المحول الذي يأخذ كائن وإرجاع سلسلة من نوع الكائن؟

وBinding="{Binding SelectedItem, Converter={StaticResource ObjectToTypeString}}"

ووتحديد تحويل النحو التالي:

public class ObjectToTypeStringConverter : IValueConverter
{
    public object Convert(
     object value, Type targetType,
     object parameter, System.Globalization.CultureInfo culture)
    {
        return value.GetType().Name;            
    }

    public object ConvertBack(
     object value, Type targetType,
     object parameter, System.Globalization.CultureInfo culture)
    {
        // I don't think you'll need this
        throw new Exception("Can't convert back");
    }
}

وستحتاج للإعلان عن مورد ثابت في مكان ما في XAML الخاص بك:

<Window.Resources>
    <convs:ObjectToTypeStringConverter x:Key="ObjectToTypeString" />
</Window.Resources>

وأين convs "في هذه الحالة هو مساحة من حيث المحول.

وآمل أن يساعد هذا.

نصائح أخرى

وهذا يستند @ AndyG في الإجابة ولكن أكثر أمنا قليلا لأنه مكتوب بشدة.

وتنفيذ وIValueConverter اسمه DataTypeConverter، الذي يقبل كائن وإرجاع نوع (كما في System.Type):

public class DataTypeConverter:IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, 
      CultureInfo culture)
    {
        return value.GetType();
    }

    public object ConvertBack(object value, Type targetType, object parameter,
      CultureInfo culture)
    {
       throw new NotImplementedException();
    }
}

وتغيير DataTrigger لاستخدام محول، وتعيين القيمة إلى النوع:

<DataTrigger Binding="{Binding SelectedItem,  
      Converter={StaticResource DataTypeConverter}}" 
      Value="{x:Type local:MyType}">
...
</DataTrigger>

وتعلن DataTypeConverter في الموارد:

<UserControl.Resources>
    <v:DataTypeConverter x:Key="DataTypeConverter"></v:DataTypeConverter>
</UserControl.Resources>

وعن طريق محول على النحو الذي اقترحه AndyG هو خيار جيد. بدلا من ذلك، هل يمكن أيضا استخدام DataTemplate مختلفة لكل نوع الهدف. سوف WPF اختيار تلقائيا DataTemplate يطابق نوع الكائن

إذا كنت في وضع يمكنها من تعديل (القاعدة) اكتب المخصصة ل"SelectedItem" بإضافة خاصية:

public Type Type => this.GetType();

وبعد ذلك يمكنك استخدام DataTrigger في XAML مثل هذا:

<DataTrigger Binding="{Binding SelectedItem.Type}" Value="{x:Type local:MyClass}">
</DataTrigger>

وميزة مقارنة الجواب AndyG الجيدة هي أن لم يكن لديك سلسلة سحرية من نوع بك في XAML، ولكن لديها كل شيء تجميع آمن. العيب: تحتاج إلى تعديل النموذج الخاص بك - والتي قد لا يكون من الممكن دائما

.
scroll top