這個答案解釋瞭如何向用戶顯示驗證結果,而不是將GotFocus和LostFocus等信息帶入viewmodel。首先,目標UI元素(例如,TextBox
)需要一些Binding
,其實際上可能無法驗證。由於您想要在視圖模型中決定事物,因此合理的方法是使用視圖模型中的IDataErrorInfo
接口來識別錯誤。
爲了使綁定使用這種驗證技術,設置ValidatesOnDataErrors=True
:
<TextBox Margin="5" Text="{Binding Text1,ValidatesOnDataErrors=True,UpdateSourceTrigger=PropertyChanged}"/>
與實例驗證視圖模型:
public class MyViewModel : INotifyPropertyChanged, IDataErrorInfo
{
public virtual string this[string columnName]
{
get
{
if (columnName == "Text1")
{
if (string.IsNullOrEmpty(Text1))
{
return "Text is required!";
}
}
return null;
}
}
private string _Text1;
public string Text1
{
get { return _Text1; }
set { _Text1 = value; RaisePropertyChangedEvent(); }
}
public event PropertyChangedEventHandler PropertyChanged;
protected void RaisePropertyChangedEvent([CallerMemberName]string prop = null)
{
var handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(prop));
}
}
現在,先試試這個沒有答案的其餘部分。將datacontext設置爲viewmodel,當您輸入/刪除任何內容時,您應該看到驗證結果如何以紅色邊框變化。
要自定義錯誤模板,你有兩個選擇:改變Validation.ErrorTemplate
和使用風格引發的Validation.HasError
財產。下面結合了這兩種方法,除非控制的重點是,以顯示錯誤和錯誤淡紅色背景上的紅色邊框:
<Window.Resources>
<ControlTemplate x:Key="MyErrorTemplate">
<Border BorderBrush="Red" BorderThickness="2">
<AdornedElementPlaceholder x:Name="controlWithError"/>
</Border>
</ControlTemplate>
<Style TargetType="TextBox">
<Setter Property="Validation.ErrorTemplate" Value="{StaticResource MyErrorTemplate}"/>
<Style.Triggers>
<MultiTrigger>
<MultiTrigger.Conditions>
<Condition Property="IsFocused" Value="False"/>
<Condition Property="Validation.HasError" Value="True"/>
</MultiTrigger.Conditions>
<Setter Property="Background" Value="LightCoral"/>
</MultiTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
正如你看到的,這是一個將被應用到沒有按任何文本隱式風格沒有適用於它的不同風格。
您可以以任何方式自定義樣式和/或控件模板中的可視外觀。
我認爲你對MVVM有一個誤解...... viewmodel不應該關注視圖特定的細節,如焦點,鼠標位置以及任何你可能想知道的東西。如果你把這些東西放到你的「viewmodel」中,它就會成爲視圖的一部分,那麼你將只有一個MV-without-a-VM模式;) – grek40
爲什麼我不能做到這一點 –
它不是那麼「*不能「*和更多*」不應該「*。如果你想做一些違背模式的事情,你應該真正描述你爲什麼需要它以及你嘗試過的一些背景。否則,你可能不會得到有用的答案。 – grek40