Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

XAML if statement

Îåêßíçóå áðü ôï ìÝëïò tarasiadis. Τελευταία δημοσίευση από το μέλος tarasiadis στις 29-04-2009, 23:02. Υπάρχουν 6 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  29-04-2009, 13:56 50334

    XAML if statement

    Πως μπορώ να ορίσω μια εντολή if then else μέσα στην xaml? Αν γίνεται...
    Εϊδα κάτι για triggers αλλα κυρίως είανι για να αλλάζει χρώματα border κλτ με βαση properties.

    Thanks.
  •  29-04-2009, 13:59 50335 σε απάντηση της 50334

    Απ: XAML if statement

    Τι ακριβώς προσπαθείς να κάνεις; Είναι πολύ γενική η ερώτησή σου...


    Vir prudens non contra ventum mingit
  •  29-04-2009, 14:05 50337 σε απάντηση της 50335

    Απ: XAML if statement

    πχ σε ένα ComboBox αν το SelectedValuePath="status" με status = 0 να έχει DisplayMemberPath="Ανοιχτό" ενώ αν είναι 1 να έχει DisplayMemberPath="Ολοκληρομένο"
  •  29-04-2009, 16:28 50351 σε απάντηση της 50337

    Απ: XAML if statement

    To DisplayMemberPath δείχνει στο property από το οποίο θα πάρει την τιμή το ComboBox για να την εμφανίσει, δεν είναι η ίδια η τιμή. Υποθέτω δεν θέλεις να αλλάζεις το property που δίνει τα data που εμφανίζονται αλλά ανάλογα την τιμή του status, να εμφανίζεις διαφορετικά πράγματα. Αυτό που θες κάνεις γίνεtaι με DataTemplates. Αν είχα να το υλοποιήσω (και έπρεπε να χρησιμοποιήσω αποκλειστικά XAML και όχι κώδικα), θα άλλαζα το GeneratedItems template του ComboBox και θα του έβαζα ένα check box. Κατόπιν θα έφτιαχνα δύο templates, ένα για status με τιμή 0 και  ένα για status με τιμή 1.
    Vir prudens non contra ventum mingit
  •  29-04-2009, 16:43 50355 σε απάντηση της 50351

    Απ: XAML if statement

    Αν μπορούσες να με βοηθήσεις...

    Έχω το combobox όπως παρακάτω:
    1
    2
    3
    4
    5
    6
    7
     
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="2" Name="ComboBoxStatus" VerticalAlignment="Top" Width="200"  
                          IsEditable="True"
                          ItemsSource="{Binding Source={StaticResource StatusOfTaskLookup}}"
                          SelectedValue="{Binding Path=status}" 
                          SelectedValuePath="status" 
                          DisplayMemberPath="status"
                          />
    Για το ItemSource έχω ορίσει μία λιστα από την οποία τραβάει τα δεδομένα, σωστά;
    Στο SelectedValue έχω συνδέσει το πεδίο της λίστας που έκανα bind.

    Τώρα από εδώ και στο εξής πως μπορώ να αλλάξω το τι θα φαίνεται στο combobox ανάλογα με την τιμή του status (Αν είναι 0 θα εμφανίζει Ανοιχτό και αν είναι 1 Ολοκληρωμένο).
    Νομίζω πως είναι μια βασική λειτουργία την οποία πρέπει να μάθω.

    Τώρα για datatemplates έχεις κάποιο καλό Link?

    Thanks.


  •  29-04-2009, 20:34 50358 σε απάντηση της 50355

    Απ: XAML if statement

    Ωραία, μιας και είναι βασική λειτουργία, δες ένα γενικό παράδειγμα και προσπάθησε να το κάνεις να παίξει στη δική σου περίπτωση:

    <Window x:Class="WpfApplication1.Window1"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:source="clr-namespace:WpfApplication1"
            xmlns:sys="clr-namespace:System;assembly=mscorlib"
            Title="Window1"
            Height="300"
            Width="476">
        <Window.Resources>
            <ObjectDataProvider MethodName="GetValues"
                                ObjectType="{x:Type sys:Enum}"
                                x:Key="EnumValues">
                <ObjectDataProvider.MethodParameters>
                    <x:Type   TypeName="source:Status" />
                </ObjectDataProvider.MethodParameters>
            </ObjectDataProvider>
            <DataTemplate  x:Key="ΕnumTemplate"
                           DataType="{x:Type source:Status}">
                <TextBlock Text="{Binding}"
                           x:Name="PART_Text" />
                <DataTemplate.Triggers>
                    <DataTrigger Binding="{Binding}"
                                 Value="aaa">
                        <Setter TargetName="PART_Text"
                                Property="Text"
                                Value="this is aaa" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding}"
                                 Value="bbb">
                        <Setter TargetName="PART_Text"
                                Property="Text"
                                Value="this is bbb" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding}"
                                 Value="ccc">
                        <Setter TargetName="PART_Text"
                                Property="Text"
                                Value="this is ccc" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding}"
                                 Value="ddd">
                        <Setter TargetName="PART_Text"
                                Property="Text"
                                Value="this is ddd" />
                    </DataTrigger>
                    <DataTrigger Binding="{Binding}"
                                 Value="eee">
                        <Setter TargetName="PART_Text"
                                Property="Text"
                                Value="this is eee" />
                    </DataTrigger>
                </DataTemplate.Triggers>
            </DataTemplate>
        </Window.Resources>
        <Grid>
    
            <ComboBox x:Name="EnumCombo" ItemsSource="{Binding Source={StaticResource EnumValues}}"
                      SelectedValue="{Binding Source={StaticResource EnumValues}, Path=[0]}"
                      ItemTemplate="{StaticResource EnumTemplate}"
                      HorizontalAlignment="Center"
                      VerticalAlignment="Center"/>
    </Grid> </Window>

    Πως παίζει το παρακάτω:

    Αρχικά, θα θεωρήσω ότι οι τιμές που εμφανίζει το ComboBox έρχονται από ένα enumeration. Γι αυτό χρειάζεται ένας ObjectDataProvider ο οποίος  μπαίνει στα resources του Window. Ουσιαστικά, αν θα το έκανα με κώδικα, θα έγραφα:

    VB.NET: EnumCombo.ItemsSource=System.Enum.GetValues(GetType(Status))
    C#: EnumCombo.ItemsSource=Enum.GetValues(typeof(Status));

    Κατόπιν, πάλι στα resoures, ορίζουμε το DataTemplate που μέσω DataTriggers, λέει τι θα συμβαίνει όταν πρόκειται να εμφανιστεί κάθε μία από τις τιμές. Ουσιαστικά λέει ότι θα κάνει set σε ένα πράγμα που λέγεται PART_Text (το οποίο είναι αν δεν κάνω λάθος είναι ένα TextBox) το property Text με συγκεκριμένη τιμή.

    Το μόνο που μένει πλέον είναι να setάρουμε το ComboBox. Με το ItemsSource ορίζουμε από που θα παίρνει τις τιμές. Με το SelectedValue ορίζουμε ότι θα πάρουμε το πρώτο item από αυτό πάνω στο οποίο έχουμε κάνει bind. Τέλος με το ItemTemplate λέμε ότι θα χρησιμοποιήσουμε το σχετικό DataTemplate όταν θα εμφανίζονται τα items.

    Γενικά, το DataBinding και τα DataTemplates είναι τεράστιο θέμα στο WPF. Θα πρέπει να έχεις μια καλή ιδέα για το πώς λειτουργεί το databinding πριν πας στα DataTemplates. Διάβασε κάθε post της Bea Stollnitz και κατόπιν τα άρθρα του Josh Smith στο CodeProject (κοίτα πρώτα τη σειρά "A Guided Tour of WPF"). Υπάρχει πάντα και MSDN. Πάντως θέλει αρκετό διάβασμα το πράγμα...


    Vir prudens non contra ventum mingit
  •  29-04-2009, 23:02 50363 σε απάντηση της 50358

    Απ: XAML if statement

    Σε ευχαριστώ πολύ για την αναλυτικότατη απάντηση και τα πολύ χρήσιμα λινκς.
    Θα ασχοληθώ αρκετά με το θέμα, οπότε θα μου φανούν χρήσιμα πιστεύω.

    Θα προσπαθήσω κάποια πράγματα μόνος μου, αλλά μάλλον θα χρειαστώ και πάλι την βοήθεια σας.

    Συγχαρητήρια για την όλη προσπάθεια του forum.
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems