IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: XAML - Binding enum a Image

V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Petr Nymsa
Tvůrce
Avatar
Petr Nymsa:22.5.2013 17:42

Ahoj, nemátě někdo zkušenosti s nabidnováním enum do nějaké komponenty jako ListView a následně podle vybraného itemu (enum) v ListView zobrazit (nabidnovat) obrázek ?

Zatím mám tuto testovací app.

<Window.Resources>

       <local:ImageEnumConverter x:Key="converter" />

       <ObjectDataProvider x:Key="EnumDataProvider"
                           MethodName="GetValues"
                           ObjectType="{x:Type System:Enum}"
                           >

               <ObjectDataProvider.MethodParameters>
                   <x:Type TypeName="local:MoodType" />
               </ObjectDataProvider.MethodParameters>
       </ObjectDataProvider>

       <DataTemplate x:Key="listTemplate">
           <TextBlock Text="{Binding }" />
       </DataTemplate>
   </Window.Resources>

   <Grid>
       <ListView x:Name="list" ItemsSource="{Binding Source={StaticResource EnumDataProvider}}"
     Margin="10,10,10,0" Height="80" VerticalAlignment="Top" />
       <Image DataContext="{Binding ElementName=list,Path=SelectedItem}"
              x:Name="img" Source="{Binding Converter={StaticResource converter}}"
              Stretch="Uniform"
              HorizontalAlignment="Center" VerticalAlignment="Center"
              Width="150" Height="150" />

   </Grid>

Bindování enum mi funguje v pohodě. Přes ObjectdataProvider si enums převedu a nabidnuju do ListView. Nyní bych chtěl podle vybraného enum zobrazit obrázek. V jiné aplikaci, kde tohle celé potřebuju zatím zobrazuju podle enum obrázky takto

"Images/"+t.ToString().ToLower()+".png");

t je enum. Tedy převedu na string a všechny znaky na malé písmena. Obrázek se tedy musí jmenovat stejně jako enum.

Zkoušel jsem ten obrázek, resp. ImageSource bindovat přes IValueConverter a to takto

class ImageEnumConverter : IValueConverter
 {

     public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
     {

             //MoodType t = (MoodType)value;
             string text = value.ToString();
             BitmapImage image = new BitmapImage();
             image.BeginInit();
             image.CacheOption = BitmapCacheOption.OnLoad;
             image.CreateOptions = BitmapCreateOptions.IgnoreImageCache;
             image.UriSource = new Uri("Images/" + value.ToString().ToLower() + ".png");
             image.EndInit();

             return image;


     }

     public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
     {
         return value;
     }
 }

Bez výsledku :(. Bindovat obrázky apod umím, ale tohle nevím jak přesně udělat.

Proč k tomu používám enum ? Přes enum mám definované nálady - smutný, naštvaný, rozmrzelý,.... Nepoužívám ho jenom pro obrázek ale i pro stav, zobrazení nálady a spoustu dalších věcí. Napadlo mě to sice zabalit do třídy, kde bych měl definovaný enum + image ale to už musím dělat ručně.

Přes Binding a ObjectdataProvider si načtu všechny enumy a jediné co mi zbývá je vyřešit ten konvert.

Nějaká rady ? Díky moc :)

Odpovědět
22.5.2013 17:42
Pokrok nezastavíš, neusni a jdi s ním vpřed
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 1 zpráv z 1.