Dobrý den,
jednoduchá otázka, jaký je rozdíl když u UIElement-u nastavím Command nebo přidám CommandBinding do CommandBindings?
Command může obsahovat pouze jeden RoutedUICommand, zatímco přes CommandBindings můžu k jednomu objektu přidat více RoutedUICommand. Tedy můžu k jednomu objektu přidat více commandů, což se mi přes attribut Command nepovedlo.
Je zde ještě nějaký rozdíl?
Děkuji za odpověď
Fórum › .NET
WPF Command vs CommandBindings
no to je trochu slozitejsi. asi tak: mas button a ten ma property Command. Property command znamene co ten buton bude delat kdyz ho stisknes. podobne jsou nejake dalsi comandy jako treba command u checkboxu. CommandBinding muzes chapat jako kolekci kde mas objekty typu CommandBinding. Tento objekt prijima 3 veci. Comand, CanExecute, Execute.
Comand jako objekt sam o sobe je objekt dedici od ICommand takze ma Execute,CanExecute a event CanExecuteChange. Comand muze byt i tzv. RelayCommand kdy napises
ICommand mujcomand=new RelayCommand(akce,canExecuteAkce);
Command binding naopak pocita stim ze si spis vytvoris prazdne RoutedCommandy (narozdil od implementovanych RelayCommandu) a pomoci CommandBindingu si to napojis.
To znamema ze v pripade CommandBindingu muzes "recyklovat" stejne "jmeno" comandu ale menit mu implementaci, zatimco pokud pouzijes RelayCommand tak to uz ma pevne danou nemenou implementaci.
Snazil sem se snad sem to moc nezamotal xD
#2 p3can
Ale když mám základ
Button tlacitko=new Button();
RoutedUICommand command=new RoutedUICommand("text","jmeno",typeof(Button));
CommandBinding bind=new CommandBinding(command);
command.Executed = method;
Tak je jedno jestli napíši
this.CommandBindings.Add(bind);
button.Command=command;
// nebo
button.CommandBindings.Add(bind);
Výsledek bude v obou případech stejný ne? Execute se vyvolá v obou případech. Jedině mě napadá, že u druhého případu můžu specifikovat kdy se má událost vyvolat (přes InputGestures)
Nějak jsem to nepochopil s tou "recyklací" jména commandu.
Ale děkuji za reakci.
neni.
toto
RoutedUICommand command=new RoutedUICommand("text","jmeno",typeof(Button));
command.Executed = method;
neexistuje.
Budto si udelate
RelayCommand command=new RelayCommand(akce,canExecuteAkce);
button.Command=command;
nebo
RoutedUICommand command=new RoutedUICommand();
CommandBinding bind=new CommandBinding(command,akce,canExecuteAkce);
button_nebo_nadrazeny_objekt.CommandBindings.Add(bind);
button.Command=command;
finta v tom je ze mate jeden nazev komandu treba "Cisteni" ale to nema zadnou implementaci KDY a CO ma udelat (pokud je to RoutedUICommand). Az teprve pres commandbinding tomu pridelate CO to ma vlastne delat. Implementace by se mela dedit v ramci WPF stromu. To znamena ze stejny comand muze delat jednu vec v leve casti obrazovky ale v prave casti obrazovky muze tentyz komand delat neco uplne jineho.
#4 p3can
Jo máš pravdu promiň, Execute event má CommandBinding.
Nicméně můžu udělat tohle:
RoutedUICommand command = new RoutedUICommand("text","name",typeof(Button));
command.InputGestures.Clear();
command.InputGestures.Add(new MouseGesture(MouseAction.MiddleClick,ModifierKeys.Alt));
CommandBinding bind = new CommandBinding(command);
bind.Executed += (object o, ExecutedRoutedEventArgs x) => { MessageBox.Show("here"); };
Button tlacitko=new Button();
tlacitko.CommandBindings.Add(bind);
Tedy nespecifikoval jsem přímo CommandProperty na tlačíko, pouze jsem přidal CommandBinding to CommandBindings tlačítka, a metoda napojená na Executed se zavolá.
Jo a ještě jedna věc, když nastavím CommandProperty na instanci RoutedUICommand, a poté dám this.CommandBindings.Add(bind) tak se Execute zavolá i při obyčejném kliknutí (I když je nastavené RoutedUICommand.InputGestures jak je napsané výše), nevíš čím může být způsobeno tohle?
no takze jinak. ono je to hodne slozite.
mas command to je vetsinou prazdna schranka proste jen jmeno.
pak mas command binding. tam bys mel priradit comandu to co ma delat. ale ZAROVEN na element na ktery umistis tento comandbinding do comandbindings tak od tohoto mista smerem dolu ve WPF stromu se k tomu comandu priradi to co ma delat.
pak mas inputbinding kde prirazujes pri jakych akcich se ma dany comand spustit. take se dedi napric WPF stromem smerem dolu.
solo property command je pro explicitni sdeleni ze po stisknuti daneho tlacitka se ma provest dany command.
skus si tento priklad na pochopeni
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:wpfApplication1="clr-namespace:WpfApplication1"
Title="MainWindow" Height="350" Width="525">
<Grid >
<Grid HorizontalAlignment="Left" Height="272" Margin="10,10,0,0" VerticalAlignment="Top" Width="213" Background="#FFF79090">
<Grid.CommandBindings>
<CommandBinding Command="wpfApplication1:MyComands.MyCommand" Executed="LeftExecute"/>
</Grid.CommandBindings>
<Grid HorizontalAlignment="Left" Height="121" Margin="15,118,0,0" VerticalAlignment="Top" Width="171" Background="#FFD160EA">
<Grid.InputBindings>
<MouseBinding Command="wpfApplication1:MyComands.MyCommand" MouseAction="RightClick"/>
</Grid.InputBindings>
<Button Content="Button" HorizontalAlignment="Left" Margin="51,63,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>
<Button Command="wpfApplication1:MyComands.MyCommand" Content="Button" HorizontalAlignment="Left" Margin="66,57,0,0" VerticalAlignment="Top" Width="75"/>
</Grid>
<Grid HorizontalAlignment="Left" Height="272" Margin="228,10,0,0" VerticalAlignment="Top" Width="260" Background="#FF52EA9E">
<Grid.CommandBindings>
<CommandBinding Command="wpfApplication1:MyComands.MyCommand" Executed="RightExecute"/>
</Grid.CommandBindings>
<Grid.InputBindings>
<MouseBinding Command="wpfApplication1:MyComands.MyCommand" Gesture="Control+RightClick"/>
</Grid.InputBindings>
<Button Content="Button" HorizontalAlignment="Left" Margin="126,181,0,0" VerticalAlignment="Top" Width="75">
<Button.InputBindings>
<MouseBinding Command="wpfApplication1:MyComands.MyCommand" Gesture="Control+LeftClick" />
</Button.InputBindings>
<Button.CommandBindings>
<CommandBinding Command="wpfApplication1:MyComands.MyCommand" Executed="RightSpecialExecute"/>
</Button.CommandBindings>
</Button>
</Grid>
</Grid>
</Window>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
private void LeftExecute(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("LeftEx");
}
private void RightExecute(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("RightEx");
}
private void RightSpecialExecute(object sender, ExecutedRoutedEventArgs e)
{
MessageBox.Show("RighSpecialtEx");
}
}
public static class MyComands
{
private static RoutedUICommand mycom = new RoutedUICommand();
public static RoutedUICommand MyCommand { get { return mycom; } }
}
#7 p3can
Děkuji za reakci. Už to snad chápou, přece jen je tu ale jedna otázka. Pokud přidám do tlacitko.CommandBindings CommandBinding, tak se tyto commandy automaticky vyvolají (pokud je splněna InputGesture podmínka)
Je to defaultní nastavení? Je nějaká možnost, jak to vypnout? Tedy že se bude tento command vyvolavat jen pro vnořene prvky?
Ještě jednou děkuji.
Edit: Existuje ještě nějaký jiný způsob, jak k jednomu objektu přiřadit více commandů?
Vím že jsem asi dotěrný, ale nerad znám jen část :)
InputGesture je volitelny blok. Muzes pouze nastavit CommandBinding. Nebo si vytvorit pouze RelayCommand ktery ma pevne danou funkčnost. Pokud ho potřebujes nastavit v ramci stromu na vice elementu tak:
a) pouzit v DataTeplate treba v listboxu
b) pouzit ve style napr pro vsechny buttony. pokud v nejakem elementu napr grid nastavym resources-> style ->targettype button-> Command tak vsechny butony obsazene v gridu budou mit nasvaveny tento command
kazdy prvek ma pouze jeden command, nicmene teoreticky je mozne např pomoci inputGesture nastavit vice commandu aby se provedli po akci Click, ale tim podle me pouzivas ty commandy spatne.
#9 p3can
Právě proto mě to zaráží, protože jeden prvek může mít pouze jeden command. Přitom například TextBox defaultně podporuje více commandů (ApplicationCommands.Copy, ApplicationCommands.Paste,...)
A například tento kod funguje, i když není specifikován command, pouze CommandBindings
Button tlacitko=new Button();
RoutedUICommand prvni = new RoutedUICommand("text","jmeno",typeof(Button));
RoutedUICommand druhy = new RoutedUICommand("text", "jmeno", typeof(Button));
prvni.InputGestures.Clear();
druhy.InputGestures.Clear();
prvni.InputGestures.Add(new MouseGesture(MouseAction.MiddleClick,ModifierKeys.Alt));
druhy.InputGestures.Add(new MouseGesture(MouseAction.MiddleClick, ModifierKeys.Shift));
CommandBinding prvniBind = new CommandBinding(prvni);
CommandBinding druhyBind = new CommandBinding(druhy);
prvniBind.Executed += (object o, ExecutedRoutedEventArgs e) => { MessageBox.Show("prvni"); };
druhyBind.Executed += (object o, ExecutedRoutedEventArgs e) => { MessageBox.Show("druhy"); };
tlacitko.CommandBindings.Add(prvniBind);
tlacitko.CommandBindings.Add(druhyBind);
Vyvolá se jak "prvni", tak i "druhy"
Proto se ptám jak je možné k jednomu objektu přidat více commandů. Ne na více elementů jeden command.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Built-In Command — založil Radek
Command v externím souboru — založil Navara
Command-nefunguje (tkinter) — založil Tom@sQo
Java Command Input — založil Redix
Button spousti automaticky command — založil
Moderátoři diskuze