WPF: كيفية تبديل محتوى خلية ListView مع DataTrigger (أو ما يعادلها)

StackOverflow https://stackoverflow.com/questions/395663

سؤال

لدي تطبيق WPF ينفذ قائمة ListView. أرغب في إظهار صورة (أيقونة صغيرة) في أحد الأعمدة اعتمادا على نوع البيانات التي يمثلها الصف. نوع من مثل الشاشة التي تراها في مستكشف Windows.

أنا أستخدم DataTriggers في مكان آخر في XAML الخاص بي، يبدو أنه يمكن استخدام طريقة مماثلة لتبديل محتويات الخلية بأكملها، لكن لا يمكنني العثور على مثال على أي شخص يقوم بذلك.

أي أفكار؟

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

المحلول

هناك ثلاث تقنيات مشتركة لهذا.

1) datatrigger:

<DataTemplate x:Key="ImageColumn">
    <Grid>
        <Image x:Name="img" Source="MyImage.png"/>
        <Rectangle x:Name="rect" Fill="Red" Visibility="Hidden"/>
    </Grid>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding TriggerProperty}" Value="2">
            <Setter TargetName="rect" Property="Visibility" Value="Visible"/>
            <Setter TargetName="img" Property="Visibility" Value="Hidden"/>
        </DataTrigger>
        <!--etc...-->
    </DataTemplate.Triggers>
</DataTemplate>

2) valueconverters:

public class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string strVal = value as string;
        switch (strVal)
        {
            case "2":
                Rectangle rect = new Rectangle();
                rect.Fill = Brushes.Red;
                return rect;

            default:
                Image img = new Image();
                ImageSourceConverter s = new ImageSourceConverter();
                img.Source = (ImageSource)s.ConvertFromString("MyImage.png");
                return img;
        }
    }
}

3) MVVM (عرض نموذج Viewmodel):

قم بإنشاء فئة ViewModel التي تلتف طراز البيانات الخاص بك. سيقوم ViewModel بيزير هذه الخصائص في نموذج البيانات ودمجها مع المنطق في خاصية جديدة.

public UIElement Icon
{
    get
    {
        if (TriggerProperty == "2")
        {
            Rectange rect = new Rectangle();
            rect.Fill = Brushes.Red;
            return rect;
        }

        else
        {
            Image img = new Image();
            ImageSourceConverter s = new ImageSourceConverter();
            img.Source = (ImageSource)s.ConvertFromString("MyImage.png");
            return img;
        }
    }
}

و xaml:

<DataTemplate x:Key="ImageColumn">
    <ContentControl Content="{Binding Icon}"/>
</DataTemplate>

نصائح أخرى

في الماضي، لقد استخدمت valueconverters لتزويد الصورة، أريد عرضها، لكنني مفتون بإمكانية استخدام Datatriggers لهذا الغرض.

Beatriz Stollnitz المشاركات حلا لقضية مماثلة هنا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top