私のWPFアプリケーションでは、データバインドTextBox
とデータバインドItemsControl
があります。 ItemsControl
の内容はTextBox
の内容によって決まります。 TextBox
に値を入力し、タブを押してItemsControl
の最初の項目(TextBox
の値から作成)を入力したいと考えています。私が抱えている問題は、WPFがテンプレート項目をItemsControl
に作成する前に、タブアクションが評価されることです。WPFタブをデータバインドItemsControlに
<Window x:Class="BindingExample.Window1" x:Name="SelfControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:loc="clr-namespace:BindingExample" Title="Window1" Height="300" Width="400">
<Window.Resources>
<DataTemplate DataType="{x:Type loc:ChildClass}">
<TextBox Text="{Binding Value}" />
</DataTemplate>
</Window.Resources>
<StackPanel DataContext="{Binding ElementName=SelfControl}" Focusable="False">
<Label Content="Options: A, B, C" />
<TextBox Text="{Binding Object.Value}" />
<ItemsControl Margin="16,0,0,0" ItemsSource="{Binding Object.Children}" Focusable="False">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel Orientation="Horizontal" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
</ItemsControl>
<TextBox Text="Box2" />
</StackPanel>
</Window>
このコードで
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
namespace BindingExample
{
public partial class Window1
{
public static readonly DependencyProperty ObjectProperty = DependencyProperty.Register("Object", typeof(ParentClass), typeof(Window1));
public ParentClass Object
{
get { return GetValue(ObjectProperty) as ParentClass; }
set { SetValue(ObjectProperty, value); }
}
public Window1()
{
InitializeComponent();
Object = new ParentClass();
}
}
public class ParentClass : INotifyPropertyChanged
{
private string value;
public string Value
{
get { return value; }
set { this.value = value; if (PropertyChanged != null) PropertyChanged(this, new PropertyChangedEventArgs("Children")); }
}
public IEnumerable<ChildClass> Children
{
get
{
switch (Value.ToUpper())
{
case "A": return new ChildClass[] { "A-1", "A-2", "A-2" };
case "B": return new ChildClass[] { "B-1", "B-2", "B-3" };
case "C": return new ChildClass[] { "C-1", "C-2", "C-2" };
default: return new ChildClass[] { "Unknown" };
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
}
public class ChildClass
{
public string Value { get; set; }
public static implicit operator ChildClass(string value) { return new ChildClass { Value = value }; }
}
}
が、私は、最初のTextBox
に「A」と入力し、Tabキーを押して、子供TextBox
にフォーカスシフトを有するがしたい:次のコードは、この問題を示していますテキスト「A-1」。代わりに、フォーカスはテキストボックス "Box2"でスキップします。ここで私が探している行動をどのように達成することができますか?
注:ジュリアン・プーランが指摘したように、PropertyChanged
にTextBox
にUpdateSourceTrigger
を切り替えることによって、この作業を行うことが可能です。しかし、これは、 "あなたが入力するように"バインディングが受け入れられる場合にのみ機能します。私の場合は、1回のキーストロークで値とタブを設定したいと思います。 ItemsControlにテンプレートアイテムをオンデマンドで作成させるための方法はありますか?
これは機能します。しかし、理想的には、コントロールがフォーカスを失ったときにバインディングを発生させたいのですが、ユーザーが入力している間ではありません。 –
最初のTextBoxがフォーカスを失ったときにまだ作成されていないため、ItemsControl内のTextBoxにフォーカスを自動的に設定することはできません。フォーカスを元の位置に戻すコードを書くこともできますが、実際には面倒なように見えます。 –