Approccio MVVM ai dialoghi mahapps.metro

1

Voglio utilizzare un metodo ShowMessageAsync , ma, a prima vista, non esiste un modo ovvio per eseguire il binding di ViewModel , anche se ci sono già un certo numero di risposte ed esempi su questo.

Ora, per un classico, standard Status TextBlock ,

<TextBlock x:Name="TbStatusMsg" Text="{Binding StatusMsg}" VerticalAlignment="Bottom"  Height="20"
           TextAlignment="Center" HorizontalAlignment="Stretch" />

Avrei avuto il solito Property nel ViewModel:

private string statusMsg;
public string StatusMsg {
    get { return statusMsg; }
    set { 
        statusMsg = value;
        OnPropertyChanged(() => StatusMsg); 
    }
}
public void ClearMsg()
{
    StatusMsg = "";
}

e penso (da un punto di vista astratto ) che avrebbe senso tenerlo come tale (può sempre fare TextBlock Visibility="Hidden" ) perché credo che < em> modo il messaggio viene mostrato è solo fino a View , quindi, in altre parole, lo gestirò attraverso un gestore di eventi UI :

    public Window1()
{
    InitializeComponent();
    DataContext = viewModel;
    DependencyPropertyDescriptor dp = DependencyPropertyDescriptor.FromProperty(TextBlock.TextProperty, typeof(TextBlock));
    dp.AddValueChanged(TbStatusMsg, async (object a, EventArgs b) =>
    {
        if (TbStatusMsg.Text.Length == 0)
        {
            return;
        }
        await this.ShowMessageAsync("Message", TbStatusMsg.Text);
        viewModel.ClearMsg();
    });
}

Hai qualche critica o qualche motivo concettuale perché non andrebbe bene?

Bene, la mia unica riserva è che una proprietà allegata "leggera" (un semplice testo per eseguire il binding) potrebbe essere una sostituzione più pulita del TextBox, a meno che non faccia realmente parte del design di View.

    
posta Giulio8 28.04.2016 - 17:22
fonte

0 risposte

Leggi altre domande sui tag