我有一个屏幕数字小键盘来输入PIN码。我想要做的是在输入四位数的PIN时禁用按钮。我当然可以很容易地使用代码执行此操作,但在我看来,应该通过绑定来实现这一点。
类似的东西:
<Button Style="Whatever" IsEnabled="{Binding ElementName=PinBox ???}"/>
似乎没有办法做到这一点(说实话对我来说似乎相当原始。)所以我考虑了替代方案,它是底层Window类的普通属性。但我不确定如何绑定它。我是否需要将类本身指定为自己的数据上下文,还是需要将PIN字符串提取到视图模型中?
接下来,如何获取plain属性来更新GUI?
我想我可以定义一个视图模型类,并且有一个名为“ButtonsEnabled”的依赖项属性,但对于这样一个简单的问题,它似乎有点重量级。
如果我遗失了某些内容,请告诉我。
答案 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}}/>