2012-02-23 12 views
12

WPFの新機能。 PINを入力するための画面上のテンキーパッドがあります。私がしたいことは、PINの4桁が入力されたときにボタンを無効にすることです。私は確かにこれをコードで簡単に行うことができますが、バインディングで行うべきであると私は思っています。以下のような式へのバインド

何かが:(。正直に言うとこれは私にはかなり原始的なようです)

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

それを行う方法がないようですので、私は無地のプロパティが上にある選択肢を検討しました基礎となるWindowクラス。しかし、私はそれをバインドする方法がわかりません(自分自身のデータコンテキストとしてクラス自体を指定する必要がありますか、またはPIN文字列をビューモデルに抽出する必要がありますか?)

その後、私はGUIを更新するためのプレーンプロパティを取得します。

私はビューモデルクラスを定義し、 "ButtonsEnabled"と呼ばれる依存関係プロパティを持つことができますが、このような単純な問題のために重いようです。

私に何かが不足している場合は教えてください。

+0

あなたのコンポーネントを結合** [試すことができます(ボタン)をfunction **](http://social.msdn.microsoft.com/Forums/en/wpf/thread/b92178bc-bc1a-4ec0-ad94-b86bbf2ea56a) –

答えて

11

RボタンFO XAMLは

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

PinBoxだろうピンの入力に使用されるテキストボックス名です。

コンバーター機能が

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

しかし、実際には、これはViewModelにパターンが何のためにあるのかです。それを使用して、それはヘビー級ではありません。

+0

このリンクは使用していません。 – brainydexter

+0

これは5歳以上ですが、私は驚いていません:) – Tyson

+0

@brainydexterあなたはウェイバックマシンを使用できますか? https://web.archive.org/web/20160313063004/http://www.11011.net/wpf-binding-expressionsしかし、私は5年以上前から、私は新しいGoogleの 'wpf binding with expression'を提案しているそうですね。 – Tyson

0

converterを作成すると、PinBox.Text.Lengthに基づいてtrueまたはfalseが返されます。

あなたのXAMLはその後になる:あなたはテキストボックスに数字に応じて

をブール値を返すコンバータを書くことができ

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

commandsを使用して別の方法である:

XAML:

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

のViewModel:

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

私はこの答えが大好きで、たくさんのことを学んでいましたが、最終的に私は実際にコンバータを使用しました。私は両方を受け入れることができればいいと思うが、私はあなたにアップアップをした。 –

関連する問題