Silverlight C#とXAMLを使用してWindowsPhoneアプリに取り組んでいます。私のページには、ユーザーが操作できるデータバインドされたオブジェクトのリストをレンダリングするListBoxが含まれています。つまり、追加/名前変更/削除です。
アイテムの追加/名前変更がインプレースbool IsEditable
で行われるようになりました。つまり、オブジェクト(プロパティ)の状態に応じてTextBlockをTextBoxに交換し、パラメーター化されたものを使用VisibilityConverter
して反対のVisibility状態を管理します。
<UserControl.Resources>
<local:VisibilityConverter x:Key="VisibilityConverter" True="Visible" False="Collapsed"/>
<local:VisibilityConverter x:Key="InvertedVisibility" True="Collapsed" False="Visible"/>
</UserControl.Resources>
...
<TextBlock Text="{Binding Name}" Visibility="{Binding IsEditable, Converter={StaticResource InvertedVisibility}}" />
<TextBox Text="{Binding Name}" Visibility="{Binding IsEditable, Converter={StaticResource VisibilityConverter}}"/>
また、TextBoxが表示されたときに自動的にフォーカスを取得して、ユーザーがTextBoxをタップしなくても画面キーボードがポップアップするようにしたいのです。
通常のTextBoxにはVisibilityChangedイベントがないため、TextBoxをTextBox2にサブクラス化し、独自のイベントを追加しました。
public class TextBox2 : TextBox
{
public TextBox2()
{
DefaultStyleKey = typeof(TextBox);
}
public static readonly DependencyProperty VisibilityChangedProperty = DependencyProperty.Register(
"VisibilityChanged",
typeof(string),
typeof(TextBox2),
new PropertyMetadata("Set the VisibilityChanged event handler"));
public event VisibilityChangedEventHandler VisibilityChanged;
public delegate void VisibilityChangedEventHandler(object sender, EventArgs e);
public new Visibility Visibility
{
get
{
return base.Visibility;
}
set
{
if (base.Visibility != value)
{
base.Visibility = value;
VisibilityChanged(this, new EventArgs());
}
}
}
}
これで、私のXAMLは次のようになります。
<TextBlock Text="{Binding Name}" Visibility="{Binding IsEditable, Converter={StaticResource InvertedVisibility}}"/>
<local:TextBox2 Text="{Binding Name}" Visibility="{Binding IsEditable, Converter={StaticResource VisibilityConverter}}" VisibilityChanged="ListEdit_VisibilityChanged"/>
そして、このようなイベントハンドラー:
void ListEdit_VisibilityChanged(object sender, EventArgs e)
{
TextBox textBox = (TextBox)sender;
if (textBox.Visibility == System.Windows.Visibility.Collapsed)
return;
textBox.Focus();
}
TextBox2は適切にレンダリングされ、実行時にTextBoxと同じように動作しますが、データバインディングがの値を反転させたときにVisibilityChangedイベントハンドラーが起動しませんIsEditable
。
IsEditable
可視性を定義し、TextBox2が正しく表示されるようになるため、データバインディングが機能します。
TextBox2インスタンスを取得し、その可視性をコードで設定することで、プログラムでイベントを発生させることができます。それも機能します。
ただし、可視性の設定を担当するこのデータバインディングシナリオは機能しないようです。
何かアイデアはありませんか?