2009-07-23 30 views
1

人の連絡先リストを作成しています。WPF TextBoxテキスト複数のトリガー

私は連絡先情報の種類ごとにDataTemplatesを使用していますItemsControlを持っています。例えば。電話番号、メールアドレスなど

電話番号の場合、を4つのテキストボックスに入力して、番号を編集できます。 4フォーマットのため(彼が編集できる数値のみ、フォーマットが自動的に生成される):

+43(2)112233から2

テキストボックスなどの各パーツ。そして私はその形式で記述された全体数とメインのTextBoxを持っていると思います。つまり、ユーザーがこれら4つのテキストボックスの1つを編集すると、メインのTextBoxは、リアルタイムでフォーマットされた番号で埋められます。

DataTemplatesを使用しているので、XAMLのこのの機能に到達したいと考えています。任意のアイデア主TextBoxが正しい形式で再生成されるように、これらの4つのTextBoxにトリガを追加する方法はありますか?

答えて

2

、あなたはこれを達成するためれる多を使用することができます。ここでの例である:

<DataTemplate x:Key="PhoneNumberTemplate"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBox Name="tbPN1" /> 
    <TextBox Name="tbPN2" /> 
    <TextBox Name="tbPN3" /> 
    <TextBox Name="tbPN4" /> 
    <TextBox IsReadOnly="True"> 
     <TextBox.Text> 
     <MultiBinding StringFormat="{}+{0} ({1}) {2} - {3}"> 
      <Binding Path="Text" ElementName="tbPN1" UpdateSourceTrigger="PropertyChanged" /> 
      <Binding Path="Text" ElementName="tbPN2" UpdateSourceTrigger="PropertyChanged" /> 
      <Binding Path="Text" ElementName="tbPN3" UpdateSourceTrigger="PropertyChanged" /> 
      <Binding Path="Text" ElementName="tbPN4" UpdateSourceTrigger="PropertyChanged" /> 
     </MultiBinding> 
     </TextBox.Text> 
    </TextBox> 
    </StackPanel> 
</DataTemplate> 

このメインテキストボックスにキーが他の4つのテキストボックス

更新の内側に押されるたびに更新される:「更新」データ・ソースにするために、
を、私は次の操作を行います:

public class PhoneNumber : INotifyPropertyChanged { 

    public event PropertyChangedEventHandler PropertyChanged; 

    private void OnPropertyChanged(string propertyName) { 
    var handler = PropertyChanged; 
    if (handler != null) { 
     PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
    } 
    } 

    private string m_CountryCode; 
    public string CountryCode { 
    get { return m_CountryCode; } 
    set { 
     m_CountryCode = value; 
     ComputeFullNumber(); 
     OnPropertyChanged("CountryCode"); 
    } 
    } 

    private string m_AreaCode; 
    public string AreaCode { 
    get { return m_AreaCode; } 
    set { 
     m_AreaCode = value; 
     ComputeFullNumber(); 
     OnPropertyChanged("AreaCode"); 
    } 
    } 

    private string m_Number; 
    public string Number { 
    get { return m_Number; } 
    set { 
     m_Number = value; 
     ComputeFullNumber(); 
     OnPropertyChanged("Number"); 
    } 
    } 

    private string m_Suffix; 
    public string Suffix { 
    get { return m_Suffix; } 
    set { 
     m_Suffix = value; 
     ComputeFullNumber(); 
     OnPropertyChanged("Suffix"); 
    } 
    } 

    public string FullNumber { get; private set; } 

    private void ComputeFullNumber() { 
    FullNumber = string.Format("+{0} ({1}) {2} - {3}", m_CountryCode, m_AreaCode, m_Number, m_Suffix); 
    OnPropertyChanged("FullNumber"); 
    } 

} 

のPhoneNumberクラスは、このようにINotifyPropertyChangedのを実装しまし

は、その後、あなたのDataTemplateは次のようになります。

OK
<DataTemplate x:Key="PhoneNumberTemplate"> 
    <StackPanel Orientation="Horizontal"> 
    <TextBox Text="{Binding Path=CountryCode, UpdateSourceTrigger=PropertyChanged}" /> 
    <TextBox Text="{Binding Path=AreaCode, UpdateSourceTrigger=PropertyChanged}" /> 
    <TextBox Text="{Binding Path=Number, UpdateSourceTrigger=PropertyChanged}" /> 
    <TextBox Text="{Binding Path=Suffix, UpdateSourceTrigger=PropertyChanged}" /> 
    <TextBox Text="{Binding Path=FullNumber, Mode=OneWay}" IsReadOnly="True" /> 
    </StackPanel> 
</DataTemplate> 
+0

大丈夫です。自分のコレクションのどこかにあるPersonオブジェクトの一部である基礎となるオブジェクト(PhoneNumber)のテキスト変更をどのように反映させることができますか?他の要素だけでバインディングが指定されている場合には、次のように指定します。Text = "{Binding Path = PhoneNumber、Mode = TwoWay}" –

+0

OKこの方法で試してみるつもりです。 XAML ... –

1

TextBoxを同じ基本プロパティにバインドし、そのインテリジェンスを持つコンバーターを使用して、TextBoxに関連する電話番号の部分を抽出することができます。擬似コード:

<TextBox Text="{Binding PhoneNumber, Converter={StaticResource PhoneNumberConverter, ConverterParameter=CountryCode}}"/> 
<TextBox Text="{Binding PhoneNumber, Converter={StaticResource PhoneNumberConverter, ConverterParameter=AreaCode}}"/> 
... 

あなたはMVVMをやっている場合は、むしろコンバータを使用するよりもPhoneNumberViewModelで別のプロパティを使用します。私はこれを正しく持って、あなたは必ずしもメインのテキストボックスに電話番号を編集する必要がない場合は

+0

しかし、私は、これらのテキストボックスの1編集する場合?基礎となる値の変更は、メインTextBoxのUIは更新されません。または?私はそれが通知されることはないと思う。通知を処理するために –

+0

は、INotifyPropertyChangedインターフェイスに見て:http://msdn.microsoft.com/en-us/library/system.componentmodel.inotifypropertychanged.aspxは –

+0

OKありがとう..私は、この目的のためにMVVMを使用することにしました。 。変更を行う方がはるかに簡単です:) –