绑定到表达式

Jes*_*xer 13 data-binding wpf

我有一个屏幕数字键盘来输入PIN码.我想要做的是在输入四位数的PIN时禁用按钮.我当然可以很容易地使用代码执行此操作,但在我看来,这应该是绑定应该完成的事情.

就像是:

<Button Style="Whatever" IsEnabled="{Binding ElementName=PinBox ???}"/>
Run Code Online (Sandbox Code Playgroud)

似乎没有办法做到这一点(说实话对我来说似乎相当原始.)所以我考虑了替代方案,它是底层Window类的普通属性.但我不确定如何绑定它.我是否需要将类本身指定为自己的数据上下文,还是需要将PIN字符串提取到视图模型中?

接下来,如何获取plain属性来更新GUI?

我想我可以定义一个视图模型类,并且有一个名为"ButtonsEnabled"的依赖项属性,但对于这样一个简单的问题,它似乎有点重量级.

如果我错过了什么,请告诉我.

Ava*_*era 13

您可以根据TextBox中的数字编写一个返回布尔值的转换器

XAML按钮就是

<Button Content="Test" IsEnabled="{Binding ElementName=PinBox,Path=Text,Converter={StaticResource DigitsToBoolConverter}}" Grid.Row="1" Height="20" Width="100"></Button>
Run Code Online (Sandbox Code Playgroud)

其中PinBox是用于输入pin的文本框名称.

转换器功能是

 public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
 {
     return value.ToString().Length >= 4;
 }
Run Code Online (Sandbox Code Playgroud)

  • XAML的88个字符*应该*应该是`IsEnabled =“ {PinBox.Length == 4}”。WPF还有很长的路要走... (4认同)

Sta*_*ams 9

用另一种方式的命令:

XAML:

<Button Content="2" Style="Whatever" Command={Binding MyCommand} CommandParamater="2"/>
Run Code Online (Sandbox Code Playgroud)

视图模型:

public ICommand MyCommand { get; private set; }
public string PinNumber { get; private set; }
public void Init()
{
  MyCommand = new RelayCommand(
    param => AddPinNumberDigit(param),
    param => CanAddPin);
}
private void AddPinNumberDigit(string digit)
{
  PinNumber += digit;
}
public bool CanAddPin { 
  get
  {
    return PinNumber.Length < 3;
  }
}
Run Code Online (Sandbox Code Playgroud)