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.