【问题标题】:Validation rule for WPF treeview that has no selected item没有选定项目的 WPF 树视图的验证规则
【发布时间】:2017-09-24 12:48:05
【问题描述】:

我在 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..";
      }
      ...
   }
}

【问题讨论】:

    标签: wpf caliburn.micro


    【解决方案1】:

    在你的视图模型中实现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;
        }
    }
    

    【讨论】:

    • 树视图有一个错误框架。这对我有帮助,所以我将其标记为答案,即使更新不起作用。
    猜你喜欢
    • 1970-01-01
    • 2014-04-27
    • 2013-08-10
    • 2014-12-23
    • 1970-01-01
    • 2015-01-28
    • 1970-01-01
    • 2011-05-20
    • 1970-01-01
    相关资源
    最近更新 更多