MVVM Passando EventArgs Como Parâmetro de Comando DoCow
blend event eventargs navegador wpf
MVVM Passando EventArgs Como Parâmetro de Comando
O que $ .when.apply ($, someArray) faz? Saída de um arquivo de imagem de um servlet C ++, __try e try / catch / finally Às vezes, vejo que a URL do JSF é * .jsf, às vezes * .xhtml e, às vezes, / faces / *. Por quê? C #: qual é a maneira mais fácil de subtrair o tempo? Forma definitiva de acionar events keypress com jQuery ARC e casting de ponte Chrome, Javascript, window.open em nova aba Usando o Joda Date & Time API para analisar vários formatos Em que casos o HTTP_REFERER ficará vazio? Classificando objects Java usando várias chaves Posso misturar o Swift com o C ++? Como os arquivos Objective – C .mm Introdução ao Windows Phone 7 Capturar e registrar o corpo da resposta Imprimir sem espaço em python 3
Estou usando o Microsoft Expression Blend 4
Eu tenho um navegador ..
[XAML] ConnectionView "Empty Code Behind"
[C #] Classe AttachedProperties
[C #] Classe ConnectionViewModel
[C #] Classe ViewModelBase Aqui
Ligação com comandos funciona bem e MessageBoxes mostrado
Como passar NavigationEventArgs como parâmetros de comando quando ocorre evento navegado?
Não é facilmente suportado. Aqui está um artigo com instruções sobre como passar EventArgs como parâmetros de comando.
Você pode querer olhar para o MVVMLight – ele suporta EventArgs diretamente no comando; sua situação seria algo como isto:
Eu tento manter minhas dependencies no mínimo, então eu mesmo implementei isso em vez de ir com o EventToCommand do MVVMLight. Funciona para mim até agora, mas o feedback é bem-vindo.
Eu sempre volto aqui para a resposta, então eu queria fazer uma simples e curta para ir.
1. Usando as ferramentas do WPF. Mais fácil.
Adicionar Namespaces:
Use o EventName para chamar o evento desejado e, em seguida, especifique o nome do Method no MethodName .
2. Usando o MVVMLight. Mais difícil.
Instale o pacote GalaSoft NuGet.
Obtenha os namespaces:
Use o EventName para chamar o evento desejado e, em seguida, especifique o nome do Command na sua binding. Se você quiser passar os argumentos do método, marque PassEventArgsToCommand como true.
Delegados de Implementação do Código: Origem
Você deve obter o pacote Prism MVVM NuGet para isso.
Código sem DelegateCommand : Source
3. Usando o Telerik EventToCommandBehavior . É uma opção.
Você terá que baixar o pacote NuGet .
Eu sei que esta é uma questão bastante antiga, mas eu corri para o mesmo problema hoje e não estava muito interessado em referenciar todo o MVVMLight apenas para que eu possa usar gatilhos de events com args de evento. Eu usei MVVMLight no passado e é um ótimo framework, mas eu não quero mais usá-lo para meus projetos.
O que eu fiz para resolver esse problema foi criar uma ação de gatilho personalizado ULTRA mínima, EXTREMAMENTE adaptável que me permitiria vincular ao comando e fornecer um conversor args de evento para passar os argumentos para as funções CanExecute e Execute do comando. Você não deseja passar os argumentos de evento textualmente, pois isso resultaria em tipos de camada de visualização sendo enviados para a camada de modelo de visualização (o que nunca deveria acontecer no MVVM).
Aqui está a class EventCommandExecuter que eu criei :
Essa class tem duas propriedades de dependência, uma para permitir a binding ao comando do modelo de exibição, a outra permite vincular a origem do evento, se necessário, durante a conversão de argumentos do evento. Você também pode fornecer configurações de cultura se precisar (elas são padronizadas para a cultura atual da interface do usuário).
Essa class permite adaptar os argumentos do evento para que eles possam ser consumidos pela lógica de comando do modelo de exibição. No entanto, se você quiser apenas passar os argumentos do evento on-line, simplesmente não especifique um conversor args de evento.
O uso mais simples dessa ação de acionador no XAML é o seguinte:
Se você precisasse de access à fonte do evento, você se ligaria ao dono do evento
(isso pressupõe que o nó XAML ao qual você está anexando os gatilhos foi designado x:Name="SomeEventSource"
Esse XAML depende da importação de alguns namespaces necessários
e criar um IValueConverter (chamado NameChangedArgsToStringConverter neste caso) para manipular a lógica de conversão real. Para conversores básicos, eu geralmente crio uma instância do conversor static readonly padrão, que eu posso referenciar diretamente no XAML, como fiz acima.
O benefício desta solução é que você realmente só precisa adicionar uma única class a qualquer projeto para usar a estrutura de interação da mesma maneira que você usaria com InvokeCommandAction . Adicionar uma única class (de aproximadamente 75 linhas) deve ser muito mais preferível a uma biblioteca inteira para obter resultados idênticos.
isso é um pouco semelhante à resposta do @adabyron, mas usa gatilhos de events em vez de comportamentos. Essa solução também fornece uma capacidade de conversão de argumentos de evento, não que a solução da @adabyron também não pudesse fazer isso. Eu realmente não tenho nenhum bom motivo para eu preferir gatilhos para comportamentos, apenas uma escolha pessoal. OMI ou estratégia é uma escolha razoável.
Para as pessoas que estão encontrando este post, você deve saber que nas versões mais novas (não na versão exata desde que os documentos oficiais são pequenos neste tópico) o comportamento padrão do InvokeCommandAction, se nenhum parâmetro de comando for especificado, é passar os argumentos do evento é anexado como o CommandParameter. Então, o XAML do pôster original pode ser simplesmente escrito como:
Em seguida, em seu comando, você pode aceitar um parâmetro do tipo NavigationEventArgs (ou qualquer tipo de argumento de evento apropriado) e ele será fornecido automaticamente.
Para adicionar ao que joshb já declarou – isso funciona muito bem para mim. Certifique-se de adicionar referências a Microsoft.Expression.Interactions.dll e System.Windows.Interactivity.dll e em seu xaml faça:
Acabei usando algo assim para minhas necessidades. Isso mostra que você também pode passar um parâmetro personalizado:
Eu não acho que você pode fazer isso facilmente com o InvokeCommandAction – eu daria uma olhada no EventToCommand do MVVMLight ou similar.
Com Comportamentos e Ações no Blend for Visual Studio 2013, você pode usar o InvokeCommandAction. Eu tentei isso com o evento Drop e, embora nenhum CommandParameter foi especificado no XAML, para minha surpresa, o parâmetro Execute Action continha o DragEventArgs. Eu presumo que isso aconteceria para outros events, mas não os testei.
O que eu faço é usar InvokeCommandAction para vincular o evento de controle carregado a um comando no modelo de exibição, fornecer o controle ax: Name em Xaml e passar como CommandParameter, depois nos manipuladores de modelo de visualização de gancho de comando carregados até os events em que preciso para obter os argumentos do evento.
Aqui está uma versão da resposta do @ adabyron que impede a abstração de EventArgs vazamento.
Primeiro, a class EventToCommandBehavior modificada (agora uma class abstrata genérica e formatada com limpeza de código ReSharper). Observe o novo método virtual GetCommandParameter e sua implementação padrão:
Em seguida, um exemplo de class derivada que oculta DragCompletedEventArgs . Algumas pessoas expressaram preocupação sobre o vazamento da abstração EventArgs em seu assembly de modelo de exibição. Para evitar isso, criei uma interface que representa os valores que nos interessam. A interface pode viver no assembly do modelo de exibição com a implementação privada no assembly da interface do usuário:
Transmita o parâmetro de comando para IDragCompletedArgs , semelhante à resposta de @ adabyron.
Como uma adaptação da resposta do @Mike Fuchs, aqui está uma solução ainda menor. Estou usando o Fody.AutoDependencyPropertyMarker para reduzir parte da placa da caldeira.