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

 

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

Commands from UserControl are called more than once

Îåêßíçóå áðü ôï ìÝëïò StrouMfios. Τελευταία δημοσίευση από το μέλος StrouMfios στις 03-02-2011, 18:13. Υπάρχουν 3 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  03-02-2011, 13:45 62995

    Commands from UserControl are called more than once

    Καλησπέρα σε όλους.

    Έχω μια μικρή εφαρμογή η οποία αποτελείται απο το mainWindow και 2 userControls (AddItems και ViewItems).

    Το ViewModel το ορίζω στο MainWindow 
    <Window x:Class="ToDoListTest.Views.MainWindow"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:local="clr-namespace:ToDoListTest.Views" 
            xmlns:ViewModels="clr-namespace:ToDoListTest.ViewModels"         
            Title="MainWindow" MinHeight="380"  Width="620" Height="300">
    
        <Window.DataContext>
            <ViewModels:MainWindowViewModel />
        </Window.DataContext>

    Τα userControls τα δείχνω με αυτό τον τρόπο
    <DockPanel>
            <local:ViewItemsList DockPanel.Dock="Left"></local:ViewItemsList>
             <local:AddItemsView DockPanel.Dock="Right"></local:AddItemsView>
     </DockPanel>

    Η πρώτη μου ερώτηση είναι αν πρέπει και στα UserControls με κάποιο τρόπο (τον οποίο δεν γνωρίζω) να του δώσω το ViewModel.

    Παρατήρησα οτι αν σε ενα UserControl ορίσω σε ένα button κάποιο Command, τότε η canExecute method καλείται συνέχεια.
    Έβαλα breakpoint στην CanExecute Method του command και είδα οτι καλείται συνέχεια. Το command είναι στο MainWindowViewModel
    Κώδικας απο UserControl AddItemsView
    <Button Content="Save" Command="{Binding SaveItem}" Height="25" HorizontalAlignment="Left" Margin="113,14,0,0" Name="button1" VerticalAlignment="Top" Width="75" Grid.Row="4" />
     public ICommand SaveItem {
                get { return new RelayCommand(SaveItemExecute, CanSaveItem); }
            }
    public bool CanSaveItem() {
                return IsValid;
            }
    H δεύτερη μου ερώτηση είναι αν αυτή η συμπεροφορά είναι σωστή.

    Ευχαριστώ

    αν δεν το θες, www.antallakseto.gr
  •  03-02-2011, 16:29 63000 σε απάντηση της 62995

    Απ: Commands from UserControl are called more than once

    Ως προς την πρώτη ερώτηση, μπορείς να κάνεις ένα από τα δύο:

    • Να κάνεις bind το DataContext του ViewItemsList και του AddItemsView σε κάποιο property του MainWindowViewModel
    • Να βάλεις το ViewItemsList και το AddItemsView να έχει το καθένα το δικό του ViewModel.

    Η πρώτη περίπτωση είναι η τεχνική του sub-viewmodel. Η δεύτερη περίπτωση προσφέρεται για την περίπτωση που θες ένα view να το χρησιμοποιήσεις μέσα σε πολλαπλά άλλα views.

    Ως προς τη δεύτερη περίπτωση, ναι, είναι η τυπική συμπεριφορά του Commanding μηχανισμού.

     


    Vir prudens non contra ventum mingit
  •  03-02-2011, 16:40 63001 σε απάντηση της 63000

    Απ: Commands from UserControl are called more than once

    Ευχαριστώ πολύ για την απάντησή σου.

    Με κάλυψες απόλυτα στην πρώτη ερώτηση.

    Όσον αφορά την δεύτερη ερώτηση:
    Έχω ενα button το οποίο γίνεται enable μόνο όταν δεν έχει errors η φόρμα.

    Αυτός ο κώδικας είναι στο mainWindow.xaml.cs
    private readonly HashSet<ValidationError> errors = new HashSet<ValidationError>();
    private Lazy<MainWindowViewModel> viewModel;
    
    void InitializeValidaton() {
                viewModel = new Lazy<MainWindowViewModel>();
                Validation.AddErrorHandler(this, ErrorChangedHandler);
            }
    
            private void ErrorChangedHandler(object sender, ValidationErrorEventArgs e) {
                if (e.Action == ValidationErrorEventAction.Added) {
                    errors.Add(e.Error);
                } else {
                    errors.Remove(e.Error);
                }            
                viewModel.Value.IsValid = !errors.Any();
            }
    Απο εδώ όλα πάνε καλά.
    Το πρόβλημα είναι οτι το property IsValid ενώ παίρνει την πρώτη φορά την σωστή τιμή, μετά όταν ξανακαλείται (λόγω του μηχανισμού Commanding όπως μου είπες) παίρνει λάθος τιμή.
    Παίρνει δηλαδή την αρχική του τιμή η οποία για τα bool είναι false.

    private bool _isValid;
            public bool IsValid {
                get { return _isValid; }
                set {
                    _isValid = value;
                    RaisePropertyChanged("IsValid");
                }
            }
    
    public ICommand SaveItem {
                get { return new RelayCommand(SaveItemExecute,CanSaveItem); }
            }
    
    public bool CanSaveItem() {
                return IsValid;
            }
    Η CanSaveItem είναι η μέθοδος που καλείται πάνω απο μία φορά και αλλάζει η τιμή της.

    Αυτό φαντάζομαι οτι δεν ειναι φυσιολογικό.
    Ή αν έιναι τότε έχω κάποιο λάθος στην εφαρμογή μου.

    Ευχαριστώ


    αν δεν το θες, www.antallakseto.gr
  •  03-02-2011, 18:13 63004 σε απάντηση της 63000

    Απ: Commands from UserControl are called more than once

    KelMan:

    Ως προς την πρώτη ερώτηση, μπορείς να κάνεις ένα από τα δύο:

    • Να κάνεις bind το DataContext του ViewItemsList και του AddItemsView σε κάποιο property του MainWindowViewModel
    • Να βάλεις το ViewItemsList και το AddItemsView να έχει το καθένα το δικό του ViewModel.

    Η πρώτη περίπτωση είναι η τεχνική του sub-viewmodel. Η δεύτερη περίπτωση προσφέρεται για την περίπτωση που θες ένα view να το χρησιμοποιήσεις μέσα σε πολλαπλά άλλα views.

    Ως προς τη δεύτερη περίπτωση, ναι, είναι η τυπική συμπεριφορά του Commanding μηχανισμού.


    Έχεις μήπως να μου προτείνεις κάποιο tutorial για την τεχνική sub-viewmodal?


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