绑定到表达式

时间:2012-02-23 03:37:02

标签: wpf data-binding

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

类似的东西:

<Button Style="Whatever" IsEnabled="{Binding ElementName=PinBox ???}"/>

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

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

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

如果我遗失了某些内容,请告诉我。

4 个答案:

答案 0 :(得分:13)

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

XAML按钮将是

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

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

转换器功能

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

答案 1 :(得分:9)

使用commands的另一种方式:

XAML:

<Button Content="2" Style="Whatever" Command={Binding MyCommand} CommandParamater="2"/>

视图模型:

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;
  }
}

答案 2 :(得分:3)

不,你没有遗漏任何东西,WPF开箱即用的绑定不支持表达式。

有些人实现自己的类添加了这种类型的功能: http://www.11011.net/wpf-binding-expressions

但实际上,这就是ViewModel模式的用途。使用它,它不是重量级的。

答案 3 :(得分:0)

根据PinBox.Text.Length创建一个将返回true或false的converter

您的xaml将成为:

<Button Style="Whatever" IsEnabled={Binding ElementName=PinBox, Converter={StaticResource yourConverter}}/>