Domanda

Sto seguendo il M-V-VM modello per la mia interfaccia utente WPF.Vorrei collegare un comando all'evento TextChanged di un TextBox a un comando presente nella mia classe ViewModel.L'unico modo in cui riesco a immaginare di completare questa attività è ereditare dal controllo TextBox e implementare ICommandSource.Posso quindi istruire il comando da attivare dall'evento TextChanged.Sembra che sia troppo lavoro per qualcosa che sembra così semplice.

Esiste un modo più semplice (rispetto alla sottoclasse TextBox e all'implementazione di ICommandSource) per collegare l'evento TextChanged alla mia classe ViewModel?

È stato utile?

Soluzione

Prima di tutto, hai sicuramente considerato l'associazione dati bidirezionale al tuo viewmodel, con un UpdateSourceTrigger di PropertyChanged?In questo modo il setter della proprietà a cui ti leghi verrà chiamato ogni volta che il testo viene modificato?

Se ciò non bastasse, affronterei questo problema utilizzando i comportamenti allegati.Sul blog di Julian Dominguez troverai un articolo su come fare qualcosa di molto simile in Silverlight, che dovrebbe essere facilmente adattabile a WPF.

Fondamentalmente, in una classe statica (chiamata, diciamo TextBoxBehaviours) definisci una proprietà associata chiamata (forse) TextChangedCommand di tipo ICommand.Collega un gestore OnPropertyChanged per quella proprietà e, all'interno del gestore, controlla che la proprietà sia impostata su un TextBox;in caso affermativo, aggiungi un gestore all'evento TextChanged sulla casella di testo che chiamerà il comando specificato nella proprietà.

Quindi, supponendo che il tuo viewmodel sia stato assegnato al DataContext della tua vista, lo utilizzeresti in questo modo:

<TextBox
  x:Name="MyTextBox"
  TextBoxBehaviours.TextChangedCommand="{Binding ViewModelTextChangedCommand}" />

Altri suggerimenti

L'uso dell'associazione di eventi e del metodo di comando potrebbe non essere la cosa giusta da usare.Cosa farà esattamente questo comando?

Potresti prendere in considerazione l'utilizzo di un'associazione dati a un campo stringa nella tua VM.In questo modo puoi effettuare una chiamata a un comando o a una funzione da lì invece di avere a che fare con l'interfaccia utente.

<TextBox Text="{Binding WorldName}"/>
....
public string WorldName
{
    get
    {
        return WorldData.Name;
    }
    set
    {
        WorldData.Name = value;
        OnPropertyChanged("WorldName");
        // CallYourCustomFunctionHere();
    }
}

Non puoi semplicemente gestire l'evento TextChanged ed eseguire il comando da lì?

private void _textBox_TextChanged(object sender, EventArgs e)
{
    MyCommand.Execute(null);
}

L'alternativa, come dici tu, è creare un file TextBox che funge da fonte di comando, ma sembra eccessivo a meno che non sia qualcosa che intendi condividere e sfruttare in molti luoghi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top