gpt4 book ai didi

wpf - 数据网格验证以防止重复输入

转载 作者:行者123 更新时间:2023-12-03 10:39:41 24 4
gpt4 key购买 nike

使用下面的代码,我可以捕获无效的单元格条目。在这个简单的杂货购物 list 示例中,GroceryItem.Name只需要填写。

我现在想做的是添加验证条目不存在的能力。如果它确实存在,那么我希望突出显示相同的单元格条目,但带有适当的消息。因此,如果用户再次输入“Eggs”,单元格错误消息应该是“Eggs is already on the list”。

项目 View 模型不应该知道它的容器 View 模型,那么在“名称”属性的单元格验证期间,我在哪里可以检查重复条目?

enter image description here

集合中的项目

public class GroceryItem : ObservableObject, IDataErrorInfo
{

#region Properties

/// <summary>The name of the grocery item.</summary>
public string Name
{
get { return _name; }

set
{
_name = value;
RaisePropertyChangedEvent("Name");
}
}
private string _name;

#endregion

#region Implementation of IDataErrorInfo

public string this[string columnName] {
get {
if (columnName == "Name") {
if (string.IsNullOrEmpty(Name))
return "The name of the item to buy must be entered";
}

return string.Empty;
}
}

public string Error { get { ... } }

#endregion
}

查看模型持有集合

public class MainWindowViewModel : ViewModelBase
{

/// <summary>A grocery list.</summary>
public ObservableCollection<GroceryItem> GroceryList
{
get { return _groceryList; }

set
{
_groceryList = value;
RaisePropertyChangedEvent("GroceryList");
}
}
private ObservableCollection<GroceryItem> _groceryList;

/// <summary>The currently-selected grocery item.</summary>
public GroceryItem SelectedItem { get; [UsedImplicitly] set; }

void OnGroceryListChanged(object sender, NotifyCollectionChangedEventArgs e)
{
// doing non-validation stuff
}
}

DataGrid 的 View 绑定(bind)
<DataGrid 
x:Name="MainGrid"
ItemsSource="{Binding GroceryList}"
SelectedItem="{Binding SelectedItem}"
...
>
<DataGrid.Resources>
<Style TargetType="{x:Type DataGridCell}">
<Setter Property="TextBlock.ToolTip"
Value="{Binding Error}" />
</Style>
</DataGrid.Resources>

<DataGrid.Columns>
...
<DataGridTextColumn Header="Item" Width="*" Binding="{Binding Name, ValidatesOnDataErrors=True}" IsReadOnly="false" />
</DataGrid.Columns>
</DataGrid>

最佳答案

我不知道这是否违反了 MVVM,但我这样做的方法是将 GroceryList 传递给另一个构造函数中的 GroceryItem 并将其保存在 GroceryItem 中的私有(private) ObservableCollectiongroceryList 中。这只是对 GroceryList 的尊重,因此不会增加太多开销。

  public class GroceryItem : ObservableObject, IDataErrorInfo
{
private ObservableCollection<GroceryItem> groceryList;

public void GroceryItem(string Name, ObservableCollection<GroceryItem> GroceryList)
{
name = Name;
groceryList = GroceryList;
// now you can use groceryList in validation
}
}

关于wpf - 数据网格验证以防止重复输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9381100/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com