2017-11-10 7 views
2

環境

マイクロソフトのVisual Studio 2017
のWindows 7WPF:どのようにデータが2つのオブジェクトを持つ単一のクラスで2テキストボックスのための結合を行うために

問題/ゴール

私はデータバインディングをしたいです単一のクラスオブジェクトを持つtxtbox (今)

XAML

<!--User 1 config--> 
    <GroupBox Name="grpBoxUser1" Margin="10,10,10,10" FontSize="16" Grid.Row="0" Height="Auto" Grid.ColumnSpan="2"> 
<GroupBox.Header> 
    <TextBlock FontWeight="DemiBold" Foreground="Navy"> User 1 config</TextBlock> 
</GroupBox.Header> 
<Grid ShowGridLines="False"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto"/> 
     <RowDefinition Height="auto"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 

    <TextBlock Text="IP address: " Grid.Row="0" Grid.Column="0" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4"></TextBlock> 
    <TextBlock Text="TCP port: " Grid.Row="0" Grid.Column="2" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4"></TextBlock> 
    <TextBlock Text="Username: " Grid.Row="1" Grid.Column="0" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4"></TextBlock> 
    <TextBlock Text="Password: " Grid.Row="1" Grid.Column="2" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4"></TextBlock> 
    <TextBlock x:Name="UserConnectionStatus" Grid.Row="5" Grid.Column="0" 
         FontSize="12" FontWeight="DemiBold" Margin="4" 
         VerticalAlignment="Center" HorizontalAlignment="Left" 
         Text="{Binding Path= UserStatus}" 
         /> 
    <Button Grid.Row="1" Grid.Column="4" FontSize="12" 
        HorizontalAlignment="Center" VerticalAlignment="Bottom" 
        Margin="10" Name="UserTestButton" 
        Content="Test" VerticalContentAlignment="Center" Width="60" 
        Click="checkUserStatus" 
        /> 
    <!--<TextBlock Text="Pre-defined Layout: " Grid.Row="2" Grid.Column="0" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4"></TextBlock>--> 
    <TextBox Name="textboxIP1" Grid.Row="0" Grid.Column="1" 
        FontSize="12" VerticalAlignment="Center" 
        HorizontalAlignment="Left" Margin="4" Width="100" 
        Text="{Binding IP}" 
        PreviewTextInput="TextboxIP1PreviewTextInput" 
        /> 
    <TextBox Name="textboxPort1" Grid.Row="0" Grid.Column="3" FontSize="12" 
        VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4" Width="50" 
        Text="{Binding PORT}" 
        PreviewTextInput="TextboxPort1PreviewTextInput" 
        /> 
    <TextBox Name="textboxUser1" Grid.Row="1" Grid.Column="1" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4" Width="100" 
         Text="{Binding User_Username}" 
        /> 
    <PasswordBox Name="textboxPass1" PasswordChar="*" Grid.Row="1" Grid.Column="3" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4" Width="100" 
         /> 
    <!--<ComboBox Name="combo1" Grid.Row="2" Grid.Column="1" 
         FontSize="12" VerticalAlignment="Center" 
         HorizontalAlignment="Left" Margin="4" Width="100" 
         ItemsSource="{Binding Source={StaticResource layoutDataProvider}}"> 
      </ComboBox>--> 
</Grid> 

<!--User 2 config--> 
<GroupBox Name="grpBoxUser2" Margin="10,10,10,10" FontSize="16" Grid.Row="2" Height="Auto" Grid.ColumnSpan="2"> 
<GroupBox.Header> 
    <TextBlock FontWeight="DemiBold" Foreground="Navy"> User 2 config</TextBlock> 
</GroupBox.Header> 
<Grid ShowGridLines="False"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="auto"/> 
     <RowDefinition Height="auto"/> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 

    <TextBlock Text="IP address: " Grid.Row="0" Grid.Column="0" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4"></TextBlock> 
    <TextBlock Text="TCP port: " Grid.Row="0" Grid.Column="2" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4"></TextBlock> 
    <TextBlock Text="Username: " Grid.Row="1" Grid.Column="0" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4"></TextBlock> 
    <TextBlock Text="Password: " Grid.Row="1" Grid.Column="2" FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4"></TextBlock> 
    <TextBox Name="textboxIP2" Grid.Row="0" Grid.Column="1" 
        FontSize="12" VerticalAlignment="Center" 
        HorizontalAlignment="Left" Margin="4" Width="100" 
        Text="{Binding IP_User2}" 
        PreviewTextInput="TextboxIP1PreviewTextInput" /> 

    <TextBox Name="textboxPort2" Grid.Row="0" Grid.Column="3" FontSize="12" 
        VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4" Width="50" 
        Text="{Binding PORT_User2}" 
        PreviewTextInput="TextboxPort1PreviewTextInput"/> 

    <TextBox Name="textboxUser2" Grid.Row="1" Grid.Column="1" FontSize="12" 
        VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4" Width="100" 
        Text="{Binding User_Username_User2}"/> 

    <PasswordBox Name="textboxPass2" PasswordChar="*" Grid.Row="1" Grid.Column="3" 
         FontSize="12" VerticalAlignment="Center" HorizontalAlignment="Left" Margin="4" Width="100" /> 

    <Button Grid.Row="1" FontSize="12" VerticalAlignment="Bottom" 
        Margin="10" Name="UserTestButtonUser2" 
        Content="Test" VerticalContentAlignment="Center" Width="60" 
        Click="checkUserStatus" HorizontalAlignment="Center" Grid.Column="4" 
        /> 
</Grid> 

クラス

using System; 
    using System.ComponentModel; 
    using System.IO; 
    using System.Xml; 
    using System.Xml.Serialization; 

    namespace App 
    { 
public class UserViewModel : INotifyPropertyChanged 
{ 
    #region Properties 

    #region Private members 

    private string _ip; 
    private string _port; 
    private string _username; 
    private string _pass; 

    private string _ip2; 
    private string _port2; 
    private string _username2; 
    private string _pass2; 

    #endregion 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    /// <summary> 
    /// IP Address of the User 
    /// </summary> 
    public string IP 
    { 
     get { return _ip; } 
     set 
     { 
      _ip = value; 
      NotifyPropertyChanged("IP"); 
     } 
    } 

    /// <summary> 
    /// User Port number 
    /// </summary> 
    public string PORT 
    { 
     get { return _port; } 
     set 
     { 
      _port = value; 
      NotifyPropertyChanged("PORT"); 
     } 
    } 

    /// <summary> 
    /// User Login Username 
    /// </summary> 
    public string User_Username 
    { 
     get { return _username; } 
     set 
     { 
      _username = value; 
      NotifyPropertyChanged("User_Username"); 
     } 
    } 

    /// <summary> 
    /// User Login password 
    /// </summary> 
    public string User_Pass 
    { 
     get { return _pass; } 
     set 
     { 
      _pass = value; 
      NotifyPropertyChanged("User_Pass"); 
     } 
    } 


    public string IP_User2 
    { 
     get { return _ip2; } 
     set 
     { 
      _ip2 = value; 
      NotifyPropertyChanged("IP_User2"); 
     } 
    } 

    /// <summary> 
    /// User Port number 
    /// </summary> 
    public string PORT_User2 
    { 
     get { return _port2; } 
     set 
     { 
      _port2 = value; 
      NotifyPropertyChanged("PORT_User2"); 
     } 
    } 

    /// <summary> 
    /// User Login Username 
    /// </summary> 
    public string User_Username_User2 
    { 
     get { return _username2; } 
     set 
     { 
      _username2 = value; 
      NotifyPropertyChanged("User_Username_User2"); 
     } 
    } 

    /// <summary> 
    /// User Login password 
    /// </summary> 
    public string User_Pass_User2 
    { 
     get { return _pass2; } 
     set 
     { 
      _pass2 = value; 
      NotifyPropertyChanged("User_Pass_User2"); 
     } 
    } 

    #endregion 

    #region Constructor 

    public UserViewModel() 
    { 
    } 
    #endregion 

} 

}

GOAL

クラス(このようにややリファクタリングしたい)

私はクラス以下のようにリファクタリングしたいと思います。だから私は、単一のクラスを使用して2つのオブジェクトを作成し、それらの2つのオブジェクトをUIでバインドすることができます。

using System; 
using System.ComponentModel; 
using System.IO; 
using System.Xml; 
using System.Xml.Serialization; 

namespace App 
{ 
    public class UserViewModel : INotifyPropertyChanged 
{ 
    #region Properties 

    #region Private members 

    private string _ip; 
    private string _port; 
    private string _username; 
    private string _pass; 

    #endregion 

    public event PropertyChangedEventHandler PropertyChanged; 
    private void NotifyPropertyChanged(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    /// <summary> 
    /// IP Address of the User 
    /// </summary> 
    public string IP 
    { 
     get { return _ip; } 
     set 
     { 
      _ip = value; 
      NotifyPropertyChanged("IP"); 
     } 
    } 

    /// <summary> 
    /// User Port number 
    /// </summary> 
    public string PORT 
    { 
     get { return _port; } 
     set 
     { 
      _port = value; 
      NotifyPropertyChanged("PORT"); 
     } 
    } 

    /// <summary> 
    /// User Login Username 
    /// </summary> 
    public string User_Username 
    { 
     get { return _username; } 
     set 
     { 
      _username = value; 
      NotifyPropertyChanged("User_Username"); 
     } 
    } 

    /// <summary> 
    /// User Login password 
    /// </summary> 
    public string User_Pass 
    { 
     get { return _pass; } 
     set 
     { 
      _pass = value; 
      NotifyPropertyChanged("User_Pass"); 
     } 
    } 

    #endregion 

    #region Constructor 

    public UserViewModel() 
    { 
    } 
    #endregion 

    } 
} 

答えて

1

このようなことをします。

public class MainViewModel 
{ 
    // Your both objects of UserViewModel are in this class. 
    // Lets say U1 and U2 
} 

は今、あなたは、XAMLのDataContextのはMainViewModelことと

<GroupBox Name="grpBoxUser2" Margin="10,10,10,10" FontSize="16" Grid.Row="2" Height="Auto" Grid.ColumnSpan="2" DataContext="{Binding U1}"> 
<GroupBox Name="grpBoxUser2" Margin="10,10,10,10" FontSize="16" Grid.Row="2" Height="Auto" Grid.ColumnSpan="2" DataContext="{Binding U2}"> 

今すぐあなたのGroupBoxの制御がUserViewModelのコンテキストを持つことになりU1とU2にグループボックスのDataContextのを結合するであろう。

+0

はU1であり、U2はオブジェクトですか?またはそれらはU1クラスとU2クラスですか? – alrightyy

+2

U1とU2は、UserViewModelクラスのオブジェクトではありません。 – ParameterX

関連する問題