2012-07-18 57 views
1

出於某種原因,我無法讓我的文本框/屬性綁定「自動」與Reactive UI一起工作。如何使用ReactiveUI爲TextBox設置ViewModel綁定?

我的DataContext的是設置這樣的:

我的視圖模型是在代碼中設置背後的MainWindow.xaml.cs:

public MainWindowViewModel ViewModel { get; protected set; } 

public MainWindow() 
{ 
    ViewModel = new MainWindowViewModel(); 
} 

在我的WPF MainWindow.xaml我在DataContext和有這樣一個文本框元件:

(其它性質ommitted)

<Window x:Name="Window"> 
    <Grid DataContext="{Binding ViewModel, ElementName=Window}"> 
     <StackPanel x:Name="ContentGrid" Grid.Row="1"> 
      <TextBox Name="Password" Text="{Binding Password, Mode=TwoWay}" /> 
      ... 

在MainWindowViewModel我有這樣的屬性和欄:

string _PasswordConfirmation; 

public string PasswordConfirmation 
{ 
    get { return _PasswordConfirmation; } 
    set { this.RaiseAndSetIfChanged(x => x.PasswordConfirmation, value); } 
} 

我也有一個命令是設置這樣的:

var canHitOk = this.WhenAny(
    x => x.Password, 
    x => x.PasswordConfirmation, 
    (pass, confirm) => (pass.Value == confirm.Value && pass.Value.Length > 3)); 

OkCommand = new ReactiveCommand(canHitOk); 

正如您可以猜到,我也有密碼確認文本框中/屬性設置,以及爲按鈕設置的命令(密碼確認TextBox具有相同的問題)。由於字段/屬性組合從不在ViewModel中更新,因此該按鈕從不啓用。

我調試並確認ViewModel綁定到XAML,但文本在TextBoxes中鍵入時從未在字段/屬性組合中更新。

我查看了sample WP7 application in the GitHub repo,他們手動綁定了KeyUp事件以在屬性/字段中設置文本中的文本。如果我遵守這個約定,我有這個在我的MainWindow.xaml:

Password.KeyUp += (o, e) => 
{ 
    ViewModel.Password = Password.Text; 
}; 

但是,這是正確的方式做到這一點?我認爲Reactive UI會像我在其他MVVM框架中看到的那樣處理綁定,除非我錯了。有更容易的方法嗎?

UPDATE

正如保羅·貝茨在他回答的評論中指出的,您可以啓用綁定到加入這個屬性來綁定自動更新:

UpdateSourceTrigger=PropertyChanged 

這將使文本框元素看起來像這樣:

<TextBox Name="Password" Text="{Binding Password, UpdateSourceTrigger=PropertyChanged}" /> 
+1

你如何爲你的視圖設置'DataContext'?運行時在VS輸出窗口中是否存在綁定錯誤? – nemesv 2012-07-18 20:29:25

+0

我爲上面的ViewModel/DataContext配置添加了代碼/ xaml。 – 2012-07-19 12:49:00

回答

3

問題是,WP7文本框不更新其綁定自動在KeyUp上 - 這對每個MVVM框架都是一個問題。

+0

嘿保羅,謝謝你的回答,但我使用WPF,我只是碰巧看WP7的例子,因爲它是一個簡單的。 WPF是否應該自動更新綁定? – 2012-07-19 12:38:55

+2

如果你設置了更新源觸發器= PropertyChanged – 2012-07-19 13:21:12

+0

,那麼WPF會這麼做的,真是太棒了!謝謝! – 2012-07-19 14:09:40