2016-12-02 6 views
0

wpf mvvmで独立して動作する2つのテキストボックスがあります。しかし、今私はチェックボックスに基づいて他のテキストボックスに1つのテキストボックスの入力をバインドしたい。WPF - テキストボックスの内容をバインドするその他のテキストボックス

<Label Grid.Row="4" Grid.Column="0" Style="{StaticResource StlLblForm}" Margin="0,5">First Name:</Label> 
    <TextBox Grid.Row="4" MaxLength="10" Grid.Column="1" Style="{StaticResource StlTxtForm}" Text="{Binding FirstName}" Grid.ColumnSpan="2" Margin="0,1,0,11" /> 

    <Label Grid.Row="5" Grid.Column="0" Style="{StaticResource StlLblForm}" Margin="0,5">Last Name:</Label> 
    <TextBox Grid.Row="5" Grid.Column="1" Style="{StaticResource StlTxtForm}" Text="{Binding LastName}" AcceptsReturn="True" Grid.ColumnSpan="2" Margin="0,1,0,11" /> 
    <CheckBox Content="CopyFirstNameToLast" /> 

したがって、チェックボックスをオンにすると、名字に姓がレプリケートされます。コードなしでこれを行うことはできますか?はいの場合はどうですか?

+0

あなたはonproperty notificatio変更する必要がn – ntohl

+0

XAMLのファーストネームにファーストネームをバインドするのは簡単です(詳細はhttp://stackoverflow.com/questions/9586956/how-to-bind-a-controls-property-to-another-controls-propertyを参照してください)。 。チェックボックスを使用すると複雑になりますが、この作業を行うために値コンバーターを作成する必要があります。 –

+0

これはおそらく何か? http:// stackoverflow。com/questions/23225751/wpf-binding-to-two-properties –

答えて

2

<Label>First Name:</Label> 
<TextBox x:Name="txtFirstName" Width="100" MaxLength="10" Text="{Binding FirstName}" /> 
<Label >Last Name:</Label> 
    <TextBox Width="100"> 
    <TextBox.Style> 
       <Style TargetType="TextBox"> 
        <Setter Property="Text" Value="{Binding LastName}" /> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ElementName=chk, Path=IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Value="True"> 
          <Setter Property="Text" Value="{Binding ElementName=txtFirstName, Path=Text, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </TextBox.Style> 
     </TextBox> 
     <CheckBox x:Name="chk" Content="CopyFirstNameToLast" /> 
+0

正解を使用しています。 – AnjumSKhan

+0

は魅力的に機能します。どうもありがとうございます。それは私が探していたものです:) –

2

、あなたのアプリケーションを実装するためにMVVMパターンに従っていると、あなたは気づくべきで、そのビューがは、任意のアプリケーション・ロジックが含まれていないすべきMVVM pattern guideに従って:

ビューは、構造、レイアウトを定義する責任があり、ユーザーが画面に表示される内容が表示されます。理想的には、ビューは で、XAMLでのみ定義され、ビジネスロジックを含む のコードビハインドは限定されています。あなたのFirstNameLastNameにを複製

は、アプリケーション・ロジックの一部ですので、あなたのViewModelに、このタスクを委任する必要があります。

再度MSDNを引用:

をビューモデルは、ビューとモデルの間の仲介として機能 および表示ロジックを処理する責任があります。

これはあなたが達成しようとしているものです。

だから、あなたの質問にコードであなたが同じように、あなたは、ビューのテキストボックスにバインドされますあなたのViewModelでFirstNameLastNameプロパティを定義する必要があり、きちんと物事を保つために:

// ViewModel 
public const string FirstNamePropertyName = "FirstName"; 
private string _firstName = null; 
public string FirstName 
{ 
    get 
    { 
     return _firstName; 
    } 

    set 
    { 
     _firstName = value; 
     RaisePropertyChanged(FirstNamePropertyName); 
    } 
} 

public const string LastNamePropertyName = "LastName"; 
private string _lastName = null; 
public string LastName 
{ 
    get 
    { 
     return _lastName; 
    } 

    set 
    { 
     _lastName = value; 
     RaisePropertyChanged(LastNamePropertyName); 
    } 
} 

<!-- XAML --> 

<Label Grid.Row="4" Grid.Column="0" Style="{StaticResource StlLblForm}" Margin="0,5">First Name:</Label> 
<TextBox Grid.Row="4" MaxLength="10" Grid.Column="1" Style="{StaticResource StlTxtForm}" Text="{Binding FirstName}" Grid.ColumnSpan="2" Margin="0,1,0,11" /> 

<Label Grid.Row="5" Grid.Column="0" Style="{StaticResource StlLblForm}" Margin="0,5">Last Name:</Label> 
<TextBox Grid.Row="5" Grid.Column="1" Style="{StaticResource StlTxtForm}" Text="{Binding LastName}" AcceptsReturn="True" Grid.ColumnSpan="2" Margin="0,1,0,11" /> 

のCheckBoxができますが二つの方法で処理すること:あなたのFirstNameLastName性質とを操作 どこのViewModelのコマンドへのCheckedイベントをバインド

  • よuはあなたがそのセッターにあなたのロジックを処理 のViewModelのブール型プロパティにIsCheckedプロパティをバインドし、それにコマンドパラメータとして、チェックボックスのIsCheckedプロパティ値(難しい方法)
  • を渡す(簡単な方法)だから、

これを行うに簡単な方法:コードなし

// ViewModel 
public const string CheckedPropertyName = "Checked"; 
private bool _checked = false; 
public bool Checked 
{ 
    get 
    { 
     return _checked; 
    } 

    set 
    { 
     _checked = value; 
     RaisePropertyChanged(CheckedPropertyName); 

     // app logic is handled here 
     if (_checked) 
     { 
      LastName = FirstName; 
     } 
    } 
} 

<!-- XAML --> 
<CheckBox IsChecked="{Binding Checked}" /> 
+0

ご協力ありがとうございます。しかし、RaisePropertyChangedが定義されていないというエラーを返すBindablebaseを使用しています。 –

+0

あなたは 'BindableBase.SetProperty'を使うべきです:https://msdn.microsoft.com/en-us/library/dn736263(v=pandp.50).aspx – Alex

+0

私はすでにsetProperty –

関連する問題