没有选定项的 WPF 树视图的验证规则
Validation rule for WPF treeview that has no selected item
我在 WPF 中有一个树视图,我通过来自视图模型的 Caliburn Micro 绑定节点。
我想设置一个简单的验证:当没有选择节点时,树视图应该处于错误状态并显示一条消息,否则不会。对于文本框或组合框等其他控件,我只是在绑定时在视图中设置验证属性,并为视图模型实现 IDataErrorInfo 接口。但是我不知道如何用树视图来做到这一点。
到目前为止我的方法:
我为树创建了一个验证规则来检查是否选择了树视图节点。规则已执行,似乎有效,但我不知道如何在 Xaml 中激活验证。如何激活树视图的验证?
查看:
<TreeView Name="Items" />
视图模型:
public List<TreeViewItem> Items
{
get { return mItems; }
set
{
mItems= value;
NotifyOfPropertyChange(() => Items);
}
}
public string this[string columnName]
{
get
{
if ((columnNames == "Items") && !Items.Any(x => x.IsSelected))
{
return "Error..";
}
...
}
}
在您的视图模型中实现 INotifyDataErrorInfo
接口,并在您的视图中为 TreeView
定义一个 Validation.ErrorTemplate
。
查看:
<TreeView Name="Items" Margin="10">
<Validation.ErrorTemplate>
<ControlTemplate>
<Grid>
<Border BorderThickness="1" BorderBrush="Red">
<AdornedElementPlaceholder />
</Border>
</Grid>
</ControlTemplate>
</Validation.ErrorTemplate>
</TreeView>
查看模型:
public class TreeViewModel : INotifyDataErrorInfo
{
private readonly Dictionary<string, string> _validationErrors = new Dictionary<string, string>();
public TreeViewModel()
{
Items = new List<TreeViewItem>();
Items.Add(new TreeViewItem() { Header = "A" });
Items.Add(new TreeViewItem() { Header = "B" });
Items.Add(new TreeViewItem() { Header = "C" });
Validate();
}
private List<TreeViewItem> mItems;
public List<TreeViewItem> Items
{
get { return mItems; }
set { mItems = value; Validate(); }
}
private void Validate()
{
if (!Items.Any(x => x.IsSelected))
_validationErrors["Items"] = "error...";
else
_validationErrors.Remove("Items");
}
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public bool HasErrors => _validationErrors.Any();
public IEnumerable GetErrors(string propertyName)
{
string value;
if (_validationErrors.TryGetValue(propertyName, out value))
return new List<string>(1) { value };
return null;
}
}
我在 WPF 中有一个树视图,我通过来自视图模型的 Caliburn Micro 绑定节点。
我想设置一个简单的验证:当没有选择节点时,树视图应该处于错误状态并显示一条消息,否则不会。对于文本框或组合框等其他控件,我只是在绑定时在视图中设置验证属性,并为视图模型实现 IDataErrorInfo 接口。但是我不知道如何用树视图来做到这一点。
到目前为止我的方法:
我为树创建了一个验证规则来检查是否选择了树视图节点。规则已执行,似乎有效,但我不知道如何在 Xaml 中激活验证。如何激活树视图的验证?
查看:
<TreeView Name="Items" />
视图模型:
public List<TreeViewItem> Items
{
get { return mItems; }
set
{
mItems= value;
NotifyOfPropertyChange(() => Items);
}
}
public string this[string columnName]
{
get
{
if ((columnNames == "Items") && !Items.Any(x => x.IsSelected))
{
return "Error..";
}
...
}
}
在您的视图模型中实现 INotifyDataErrorInfo
接口,并在您的视图中为 TreeView
定义一个 Validation.ErrorTemplate
。
查看:
<TreeView Name="Items" Margin="10">
<Validation.ErrorTemplate>
<ControlTemplate>
<Grid>
<Border BorderThickness="1" BorderBrush="Red">
<AdornedElementPlaceholder />
</Border>
</Grid>
</ControlTemplate>
</Validation.ErrorTemplate>
</TreeView>
查看模型:
public class TreeViewModel : INotifyDataErrorInfo
{
private readonly Dictionary<string, string> _validationErrors = new Dictionary<string, string>();
public TreeViewModel()
{
Items = new List<TreeViewItem>();
Items.Add(new TreeViewItem() { Header = "A" });
Items.Add(new TreeViewItem() { Header = "B" });
Items.Add(new TreeViewItem() { Header = "C" });
Validate();
}
private List<TreeViewItem> mItems;
public List<TreeViewItem> Items
{
get { return mItems; }
set { mItems = value; Validate(); }
}
private void Validate()
{
if (!Items.Any(x => x.IsSelected))
_validationErrors["Items"] = "error...";
else
_validationErrors.Remove("Items");
}
public event EventHandler<DataErrorsChangedEventArgs> ErrorsChanged;
public bool HasErrors => _validationErrors.Any();
public IEnumerable GetErrors(string propertyName)
{
string value;
if (_validationErrors.TryGetValue(propertyName, out value))
return new List<string>(1) { value };
return null;
}
}