Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
没有选定项的WPF treeview的验证规则_Wpf_Caliburn.micro - Fatal编程技术网

没有选定项的WPF treeview的验证规则

没有选定项的WPF treeview的验证规则,wpf,caliburn.micro,Wpf,Caliburn.micro,我在WPF中有一个treeview,我通过viewmodel中的caliburn micro绑定节点 我想设置一个简单的验证:当没有选择任何节点时,treeview应该处于错误状态并显示消息,否则不会。对于其他控件,如textbox或combobox,我只是在绑定和实现viewmodel的IDataErrorInfo接口时在视图中设置验证属性。但我不知道如何使用treeview实现这一点 我到目前为止的做法是: 我为树创建一个验证规则,以检查是否选择了treeview节点。该规则已经执行,并且似

我在WPF中有一个treeview,我通过viewmodel中的caliburn micro绑定节点

我想设置一个简单的验证:当没有选择任何节点时,treeview应该处于错误状态并显示消息,否则不会。对于其他控件,如textbox或combobox,我只是在绑定和实现viewmodel的IDataErrorInfo接口时在视图中设置验证属性。但我不知道如何使用treeview实现这一点

我到目前为止的做法是:

我为树创建一个验证规则,以检查是否选择了treeview节点。该规则已经执行,并且似乎有效,但我不知道如何在Xaml中激活验证。如何激活treeview的验证

视图:

视图模型:

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

视图:

视图模型:


树视图有一个错误帧。这对我很有帮助,所以我把它标记为答案,当更新不起作用时也是如此。
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..";
      }
      ...
   }
}
<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;
    }
}