数日前、Silverlight では、任意の texbox のバインドを常に更新するために (各 KeyPress でのエラーを検証するために) 、システム内にあるすべての TextBoxの TextChanged イベント イベントで次のコードが必要であることに気付きました。
TextBox txCtl = (TextBox)sender; if (txCtl != null)
{
var be = txCtl.GetBindingExpression(TextBox.TextProperty);
if (be != null)
{
be.UpdateSource();
}
}
このコードはかなりうまく機能します (ソース: http://forums.silverlight.net/t/51100.aspx/1 )。問題は、私が持っている CodeBehind のすべてのビューでそれを繰り返したくないので、このコードを残すカスタム ViewBase を作成することにしました。私がしたことは単純でした:
public class ViewBase : ChildWindow
{
protected void tboxTextChanged(object sender, TextChangedEventArgs e)
{
TextBox txCtl = (TextBox)sender; if (txCtl != null)
{
var be = txCtl.GetBindingExpression(TextBox.TextProperty);
if (be != null)
{
be.UpdateSource();
}
}
}
}
そして、私のビューは UserControl ではなく ViewBase になったので、XAML も次のように変更しました。
<src:ViewBase x:Class="Oi.SCPOBU.Silverlight.Pages.CadastroClassificacao"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:src="clr-namespace:Oi.SCPOBU.Silverlight.Pages" [...]
最後に、テキスト ボックスに、通常と同じメソッドを参照するイベントを残しましたが、メソッドは CodeBehind ではなく、ViewBase にあります。
<TextBox
x:Name="tbxNome"
Width="300"
MaxLength="50"
HorizontalAlignment="Left"
TextChanged="tboxTextChanged"
Text="{Binding DTOClassificacao.Nome, Mode=TwoWay, NotifyOnValidationError=True>
私にはかなり簡単に思えますが、これはうまくいきません。コードはコンパイルされますが、実行時に InitializeComponent() メソッドで "Message=Failed to assign to property 'System.Windows.Controls.TextBox.TextChanged'. [Line: 43 Position: 37]" というエラーが表示されます。
基本クラスからイベントにメソッドを割り当てる方法を知っている人はいますか? それとも、私が持っているすべてのビューでこのコードを繰り返す必要がありますか?