2012-02-23 62 views
12

WPF的新手。我有一个屏幕上的数字小键盘来输入一个PIN。我想要做的是在输入PIN的四位数字时禁用这些按钮。我当然可以用代码很容易地做到这一点,但在我看来,这是应该与绑定完成的事情。绑定到表达式

喜欢的东西:

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

似乎没有办法做到这一点所以,我认为是替代,这是一个普通的属性上(这是诚实似乎相当原始的给我。)底层Window类。但我不知道如何绑定到它(我是否需要指定类本身作为自己的数据上下文,还是我需要将PIN字符串提取到视图模型?)

然后,怎么做我得到普通属性来更新GUI。

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

让我知道如果我失去了一些东西。

+0

你可以试试[**结合您的组件(按钮)功能**](http://social.msdn.microsoft.com/Forums/en/wpf/thread/b92178bc-bc1a-4ec0-ad94-b86bbf2ea56a) – 2012-02-23 03:47:39

回答

11

你可以写一个转换器根据数字在文本框中

boolean值,返回FO R按钮的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; 
} 
3

不,你不会遗漏任何东西,WPF开箱绑定不支持表达式。

已经有一些人实现自己的类,添加此类型的功能: http://www.11011.net/wpf-binding-expressions

不过说真的,这就是视图模型模式是。使用它,它不重量级。

+0

链接不工作了。 – brainydexter 2017-08-09 18:20:58

+0

鉴于这是5岁以上,我不感到惊讶:) – Tyson 2017-08-09 22:46:29

+0

@brainydexter你可以使用wayback机? https://web.archive.org/web/20160313063004/http://www.11011.net/wpf-binding-expressions但鉴于其5岁以上,我会建议一个新的谷歌'wpf绑定包括表达'或东西像那样。 – Tyson 2017-08-09 22:49:14

0

创建converter,将返回true或基于PinBox.Text.Length假。

那么你的XAML将成为:

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

使用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; 
    } 
} 
+0

我喜欢这个答案,并从中学到很多,但最终我实际上使用了转换器。我希望我能接受这两个,但我确实让你高兴。 – 2012-02-26 03:55:48