【发布时间】:2023-03-26 20:17:02
【问题描述】:
这是我的 XAML 文件:
<Window x:Class="WpfListView.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfListView"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<ListView Margin="10" Name="lvUsers">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="150" />
<ColumnDefinition Width="20" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" Margin="0,0,5,0">
<Binding Path="Mail" Mode="TwoWay">
<Binding.ValidationRules>
<local:NameValidation>
<local:NameValidation.Params>
<local:NameValidationParameters
OriginalTree="{Binding Source={x:Reference lvUsers}}"
OriginalName="{Binding RelativeSource={RelativeSource Self}}"/> <!-- I want the OriginalName to be TextBox.Text-->
</local:NameValidation.Params>
</local:NameValidation>
</Binding.ValidationRules>
</Binding>
</TextBox>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</Grid>
</Window>
这是我的MainWindow 班级:
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
List<User> items = new List<User>();
items.Add(new User() { Name = "John Doe", Age = 42, Mail = "john@doe-family.com" });
items.Add(new User() { Name = "Jane Doe", Age = 39, Mail = "jane@doe-family.com" });
items.Add(new User() { Name = "Sammy Doe", Age = 7, Mail = "sammy.doe@gmail.com" });
lvUsers.ItemsSource = items;
}
}
这是我的ValidationRule 课程:
public class NameValidationParameters : DependencyObject
{
public ListView OriginalTree
{
get { return (ListView)this.GetValue(OriginalTreeProperty); }
set { this.SetValue(OriginalTreeProperty, value); }
}
public string OriginalName
{
get { return (string)this.GetValue(OriginalNameProperty); }
set { this.SetValue(OriginalNameProperty, value); }
}
public static readonly DependencyProperty OriginalTreeProperty
= DependencyProperty.Register(nameof(OriginalTree), typeof(ListView),
typeof(NameValidationParameters));
public static readonly DependencyProperty OriginalNameProperty
= DependencyProperty.Register(nameof(OriginalName), typeof(string),
typeof(NameValidationParameters));
}
public class NameValidation : ValidationRule
{
public string ErrorMessage
{ get; set; }
public NameValidationParameters Params { get; set; }
public override ValidationResult Validate(object value, CultureInfo cultureInfo)
{
ValidationResult lResult = null;
return lResult;
}
}
如您所见,当调用 NameValidation.Validate 时,我希望 NameValidation.Params 填充正确的变量:
-
NameValidation.Params.OriginalTree应该是原来的ListView。这个我可以得到。 -
NameValidation.Params.OriginalName应该是当前文本框的文本。在这种情况下,它绑定到Mail,所以我希望看到它是像john@doe-family.com这样的电子邮件地址。但是我无法解决这个问题;我只能看到NameValidation.Params.OriginalName是“WpfListView.NameValidationParameters”
另外,我希望能够访问NameValidation.Validate 方法内列表中的当前索引。我怎样才能得到它?
【问题讨论】:
-
对于 originalName,可以绑定为 {Binding Path=Text,RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}
-
但是,我建议您使用 INotifyDataErrorInfo 来实现模型类的包装并将其绑定到 UI。这将是显示验证错误的一种更简洁的方式,并且可以异步工作。
-
@Skyuppercut,感谢您的评论和建议。你想扩展你的答案吗?
-
@Skyuppercut,您将其绑定为
OriginalName="{Binding Path=Text,RelativeSource={RelativeSource AncestorType={x:Type TextBox}}}"/>的建议无效;OriginalName仍然是NULL
标签: c# wpf xaml data-binding