Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

MVVM zamena za event

[es] :: .NET :: WPF Programiranje :: MVVM zamena za event

[ Pregleda: 4842 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon MVVM zamena za event12.12.2015. u 05:19 - pre 101 meseci
Imam button cija je jedina uloga da menja velicinu slova Contenta neka 3 druga button-a. Kad kliknem na neko od ta 3 button-a Content treba da se unese u textbox. Ako pritisnem enter u textboxu treba da se desi isto sto se desi ako kliknem na neki Insert button. A za Insert button imam ICommand koji cu bindovati.
Mogao bih u ViewModel-u da napravim ICommand za svaki button, ali onda mi se cini da ViewModel gubi smisao, cini mi se kao da bi to trebalo sam View da resi.
Preko event-ova mi treba par linija koda, ali hteo bih "samo" kroz Xaml. Mora biti trivijalan problem, ali vec "nekoliko" sati stojim u mestu, citam blogove, stackoverlow, tutorijale i msdn dokumentaciju za razne stvari.

Hteo sam da stavim AttachedProperty na jedan button, a AttachedBehavior sa custom convertorom na ostale; u Blendu sam nesto slicno sa triggerima pokusavao, ali tu mi je ispalo toliko koda u xaml-u da mi je vise smisla imalo da uradim preko event-ova; mislio sam i EventTrigger-e iz Windows.Interactivity da koristim... Ali sta god da mi je palo na pamet dolazio sam do toga da mi je potreban ICommand ViewModel-a.

Ne znam da li je u duhu MVVM-a da se napravi neka helper klasa, u View folderu, koja ce imati ICommand za svaki event?

Moze li me neko uputiti u pravom smeru? Ovaj "problem" je smesan, ali ne znam kako da ga uradim bez event-ova u code behind.


Update:
Ne treba pomoc, uradio sam sa AttachedProperty&Behavior.
Ne znam jel mogu sam da izbrisem thread nekako ili to samo moderatori mogu..






[Ovu poruku je menjao bsod17 dana 12.12.2015. u 18:07 GMT+1]
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: MVVM zamena za event13.12.2015. u 19:54 - pre 100 meseci
Kako si uradio sa attached property?

MVVM nacin je da imas ICommand propertije u ViewModelu (opet, zbog lakseg testiranja) jer meso ICommand-a obicno menja state ViewModela. Ako je klik na dugme trebalo da izvrsi samo vizuelne promene u VisualTree-u onda za to koristis trigere, a sam trigere mozes da ubacis u stilove u resurse, narocito ako se reusuju, onda nemas toliko guzve u samom sors XAMLu.

Rule of thumb: ako even handler menja view state => ICommand iz Viewmodela, u suprotnom trigger.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: MVVM zamena za event15.12.2015. u 01:04 - pre 100 meseci
Hm, gledao sam nesto o trigerima, ali ocigledno ih nisam dovoljno proucio jer sam uvek dolazio do toga da mi treba ICommand.

A napravio sam klasu UmlautStackPanel koja nasledjuje StackPanel i stavio sva 4 dugmeta tu. Ubacio ovo
Code:

private static bool contentIsLowerCase = true;
private static List<Button> umlautButtons = new List<Button>();

public static readonly DependencyProperty CaseChangerProperty = DependencyProperty.Register("CaseChanger", typeof(Button), typeof(UmlautStackPanel),
            new PropertyMetadata(null, OnPropertyChanged));


U xaml-u sam bind-ovao button iz UmlautStackPanel-a koji predstavlja ovaj CaseChanger. U OnPropertyChanged kroz for loop nalazim Children panela i ukoliko je u pitanju button i nije CaseChanger onda taj button dodajem u ovu gore umlautButtons listu. Na kraju metode dodajem event handler na caseChanger.Click i tu za svako dugme iz liste, ukoliko Content nije null, menjam velicinu slova i menjam vrednost contentIsLowerCase.

Tako da ova klasa tehnicki sluzi samo za situaciju kada hocu da imam dugme koje menja velicinu Content-a ostalih dugmadi u stack panelu. Verovatno bih mogao da je preimenujem, moze da se koristi za menjanje velicine slova bilo kakvog Content-a, iako mi samo na jednom mestu treba xd. Ne znam trenutno kako se ovo sa trigerima radi tako da ne mogu da uporedim. ali pretpostavljam da su oni bolja alternativa, s obzirom na to da samo na jednom mestu koristim ovaj stack panel i ne za neku komplikovanu radnju.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: MVVM zamena za event15.12.2015. u 08:09 - pre 100 meseci
Trigeri su ekstra prosti, u ovom slucaju tebi treba DataTrigger:

Code (xml):

<Window x:Class="WpfApplication1.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
       xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
       xmlns:local="clr-namespace:WpfApplication1"
       mc:Ignorable="d"
       Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <ResourceDictionary>
            <Style x:Key="ConditionalSupersize" TargetType="Button">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=supersizer, Path=IsChecked}" Value="True">
                        <Setter Property="FontSize" Value="25" />
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ResourceDictionary>
    </Window.Resources>
    <StackPanel>
        <ToggleButton Content="Supersize them all!" x:Name="supersizer"></ToggleButton>
        <Button Content="I wanna be big!!" Style="{StaticResource ConditionalSupersize}"></Button>
        <Button Content="Me tooo!!" Style="{StaticResource ConditionalSupersize}"></Button>
        <Button Content="Me, me, me,me!" Style="{StaticResource ConditionalSupersize}"></Button>
    </StackPanel>
</Window>
 


I dobije se ovo:


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
Prikačeni fajlovi
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: MVVM zamena za event15.12.2015. u 12:03 - pre 100 meseci
Ok, ovo je mnogo bolje od mog resenja Samo sto ja necu FontSize property da menjam, nego velicinu slova. Tako da sam za setter property napravio ovo:

Code:

public static readonly DependencyProperty AllCapsProperty =
            DependencyProperty.RegisterAttached("AllCaps", typeof(bool), typeof(AttachedProperties), new PropertyMetadata(false, OnChangedProperty));

        private static void OnChangedProperty(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
         Button button = (Button)d;
            string content = button.Content.ToString();
            if (content != null)
            {
                button.Content = (bool)e.NewValue ? content.ToUpper() : content.ToLower();
            }
        }

        public static void SetAllCaps(Button button, bool value)
        {
            button.SetValue(AllCapsProperty, value);           
        }

        public static bool GetAllCaps(Button button)
        {
            return (bool)button.GetValue(AllCapsProperty);
        }


S tim sto AllCaps naziv ima smisla ukoliko je True, ali ukoliko je False onda ne vraca Content string na prvobitnu vrednost nego uvek menja u mala slova. To mi i treba, ali mogao bih da smislim bolji naziv za property, nesto bolje od CaseChangerStartWithUpperCase

Moguce da vec ima neki property koji ogranicava text samo na lowercase ili uppercase, ali nisam ga nasao.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: MVVM zamena za event15.12.2015. u 13:11 - pre 100 meseci
Al pazi, ovde si bukvalno napravio vise koda nego za ICommand Resenje jedno za tvoj problem je da Content dugmeta bindijes za property u ViewModelu i da na ICommand taj property prebacis u uppercase. Sa sve propertijima to je manje koda od ovog sto si napravio

Drugo resenje je da napravis svoje dugme koje nasledjuje Button i da dodas VisualCaps ili slican dependency property i onda mozes da ga trigerujes .


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: MVVM zamena za event15.12.2015. u 13:35 - pre 100 meseci
Ima vise linija koda nego za ICommand, ali ovo je minimalno koda za attached property&behavior. A ovo je samo vizuelna promena na View-u tako da ne zelim da pravim ICommand, nema mi smisla da bude u ViewModelu.
A ne vidim razliku ovog mog attached property-ja za obicno dugme i dugmeta koje nasledjuje Button i ima svoj native property.


[Ovu poruku je menjao bsod17 dana 15.12.2015. u 15:39 GMT+1]
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: MVVM zamena za event15.12.2015. u 14:21 - pre 100 meseci
Attached property ne moze da se referencira iz stilova, ako se ne varam. Nasledjeni DP moze. Onda mozes da kacis rtigere I data trigere na njega.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: MVVM zamena za event15.12.2015. u 14:38 - pre 100 meseci
Moze, iskoristio sam tvoj kod, samo sam property zamenio.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12846



+4783 Profil

icon Re: MVVM zamena za event15.12.2015. u 14:47 - pre 100 meseci
Dodatni nacini da se uradi je da imas jos jedna property koji vraca uppercase pa da menjas binding u trigger-u ili da koristis konverter u binding-u (postavis ga u trigger-u). Jedan isti konverter mozes koristiti gde god ti to treba.
Mozes imati i bool property UseUpper (ili tako nesto) koji je bind-ovan na taj ToggleButton i koji na svoju promenu okine PropertyChanged za sve one koji se trebaju prebaciti u upper case a njihovi getter-i mogu da vrate sve velikim slovima ako je UseUpper.
Itd. itd. :)
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: MVVM zamena za event15.12.2015. u 15:07 - pre 100 meseci
Mozda ubacim Enumeration (UpperCase, LowerCase i mozda NoChange ili Default) da bude umesto bool. Onda u Setter-u, za Value property-ja izaberem jedno od ovoga. To ima malo vise logike nego true i false.
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6041



+4631 Profil

icon Re: MVVM zamena za event15.12.2015. u 16:04 - pre 100 meseci
Imas vec sistemski enum koji se zove CharacterCasing:

Code (csharp):

namespace System.Windows.Controls
{
    public enum CharacterCasing
    {
        Normal = 0,
        Lower = 1,
        Upper = 2
    }
}
 

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

bsod17

Član broj: 331246
Poruke: 20
*.dynamic.sbb.rs.



Profil

icon Re: MVVM zamena za event15.12.2015. u 16:13 - pre 100 meseci
Taman. Promenio sam bool u CharacterCasing. Hvala na pomoci
 
Odgovor na temu

[es] :: .NET :: WPF Programiranje :: MVVM zamena za event

[ Pregleda: 4842 | Odgovora: 12 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.