c# - WPF 绑定:禁用 TextBoxes + 验证和 DataContext 问题
问题描述
我的简单程序有两个窗口:
- 从第一个我设置一个
Boolean
值,然后...... - 我将在第二个窗口中根据上述值本身禁用一些文本框。
所述文本框的特征还在于验证绑定。现在我的验证任务完美无缺,但我无法使绑定到IsEnabled
TextBox 属性工作。
这是我的 XAML 的片段,其中包含一个 TextBox(目前是我绑定的唯一一个):
<TextBox x:Name="tbSlave1" Validation.Error="ValidationError" IsEnabled="{Binding TextBoxEnabled}" Text="{Binding UpdateSourceTrigger=PropertyChanged, Path=SlavePoint1Name, ValidatesOnDataErrors=true, NotifyOnValidationError=true}"/>
虽然这是我的第二个窗口类:
public partial class GeneratorWindow : Window, INotifyPropertyChanged
{
private readonly Validator validator = new Validator();
private int noOfErrorsOnScreen;
public GeneratorWindow()
{
this.InitializeComponent();
this.grid.DataContext = this.validator;
}
public int NumberOfPoints { private get; set; }
public int MainPDC { private get; set; }
public event PropertyChangedEventHandler PropertyChanged;
private void NotifyPropertyChanged(String info)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(info));
}
}
private Boolean IsEnabled;
public Boolean TextBoxEnabled
{
get { return IsEnabled; }
set
{
IsEnabled = value;
NotifyPropertyChanged("TextBoxEnabled");
}
}
private void ValidationError(object sender, ValidationErrorEventArgs eventArgs)
{
if (eventArgs.Action == ValidationErrorEventAction.Added)
{
this.noOfErrorsOnScreen++;
}
else
{
this.noOfErrorsOnScreen--;
}
}
private void ValidationCanBeExecuted(object sender, CanExecuteRoutedEventArgs eventArgs)
{
eventArgs.CanExecute = this.noOfErrorsOnScreen == 0;
eventArgs.Handled = true;
}
private void ValidationExecuted(object sender, ExecutedRoutedEventArgs eventArgs)
{
// If the validation was successful, let's generate the files.
this.Close();
eventArgs.Handled = true;
}
}
现在,我得到的是我的窗口被禁用(无法选择任何文本框),显然,这是:
System.Windows.Data 错误:40:BindingExpression 路径错误:在“对象”“验证器”(HashCode = 14499481)上找不到“TextBoxEnabled”属性。BindingExpression:Path=TextBoxEnabled; DataItem='验证器' (HashCode=14499481); 目标元素是'TextBox'(名称='tbSlave1');目标属性是“IsEnabled”(类型“布尔”)
据我所知,罪魁祸首是我DataContext
在类构造函数中管理的方式。我可能需要在验证器行中添加一些东西或完全改变它,但我不明白怎么做。
解决方案
我认为如果您将 设置DataContext
为GeneratorWindow
并相应地更新您的绑定,您应该没问题。为此,您需要更改Validator
为公共财产。
更改验证器定义:
public Validator Validator { get; } = new Validator();
数据上下文:
this.grid.DataContext = this;
更新绑定:
<TextBox x:Name="tbSlave1"
Validation.Error="ValidationError"
IsEnabled="{Binding TextBoxEnabled}"
Text="{Binding UpdateSourceTrigger=PropertyChanged,
Path=Validator.SlavePoint1Name,
ValidatesOnDataErrors=true,
NotifyOnValidationError=true}"/>
推荐阅读
- arrays - 如何对数组进行排序
- pandas - Pandas 中至少过去 n 周的最后一个季度的滚动平均值(如果存在至少一个数据点)
- javascript - 在javascript画布上看不到矩形
- javascript - Brython 错误“违反以下内容安全策略指令:“script-src 'self'”“
- python - 为什么这不适用于我的 Discord 机器人?
- css - 如何将过渡速度应用于自定义(ul > li)下拉菜单?
- java - 我应该如何让我的 getMove() 方法与我的国际象棋应用程序中的 GUI 交互?
- dataframe - 使用 pd.read_csv 读取 .mpr/.mps/.mpt 文件
- c# - 使用 Unity 新输入系统问题
- pari-gp - 有没有更好的方法来使用 Pari/GP 提取实数的数字?