0

あるテキストボックスから別のテキストボックスへのデータバインディングが正しく行われません。使用しているコードは次のとおりです。

編集:

メインウィンドウ xaml:

   <Grid>
    <TextBox Name="txtBox1" AcceptsReturn="True" Margin="0,0,203,148" VerticalScrollBarVisibility="Visible" LostFocus="txtBox1_LostFocus" TextChanged="txtBox1_TextChanged">

    </TextBox>
    <Button Content="ButtonToDisplay" Height="46" HorizontalAlignment="Left" Margin="362,71,0,0" Name="button1" VerticalAlignment="Top" Width="98" Click="button1_Click" />
</Grid>

CheckAddressWindowxaml:

     <Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="195"/>
        <RowDefinition Height="28"/>
        <RowDefinition Height="50"/>
    </Grid.RowDefinitions>
    <GroupBox Name="grpFullName" Header="Name Details" BorderBrush="Black" BorderThickness="1" FontWeight="Bold" >
        <Grid ShowGridLines="False">
            <Grid.RowDefinitions>
                <RowDefinition Height="15"/>
                <RowDefinition Height="50"/>
                <RowDefinition Height="25"/>
                <RowDefinition Height="25"/>
                <RowDefinition Height="25"/>
                <RowDefinition Height="25"/>
                <RowDefinition Height="15"/>
            </Grid.RowDefinitions>
            <Grid Grid.Row="1">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.4*"/>
                    <ColumnDefinition Width="0.7*"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0" Name="lblstreet" Content="Street" VerticalAlignment="Top"></Label>
                <TextBox Grid.Column="1" Name="txtStreet" VerticalAlignment="Stretch" Margin="0,0,0,5" TextChanged="txtStreet_TextChanged" Text="{Binding Path=szStreet Mode=OneWay}"></TextBox>
            </Grid>
            <Grid Grid.Row="2">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.4*"/>
                    <ColumnDefinition Width="201"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0" Name="lblCity" Content="City" VerticalAlignment="Top"></Label>
                <TextBox Grid.Column="1" Name="txtCity" VerticalAlignment="Top" Text="{Binding Path=szCityname,Mode=OneWay}"></TextBox>
            </Grid>
            <Grid Grid.Row="3">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.4*"/>
                    <ColumnDefinition Width="0.7*"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0" Name="lblstate" Content="State/Province" VerticalAlignment="Top"></Label>
                <TextBox Grid.Column="1" Name="txtState" VerticalAlignment="Top" Text="{Binding Path=szState}"></TextBox>
            </Grid>
            <Grid Grid.Row="4">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.4*"/>
                    <ColumnDefinition Width="0.7*"/>

                </Grid.ColumnDefinitions>
                <Label Grid.Column="0" Name="lblZip" Content="Zip/PostalCode" VerticalAlignment="Top" Grid.ColumnSpan="2"></Label>
                <TextBox Grid.Column="2" Name="txtZip" VerticalAlignment="Top" Text="{Binding Path=iZip}"></TextBox>
            </Grid>
            <Grid Grid.Row="5">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="0.4*"/>
                    <ColumnDefinition Width="0.7*"/>
                </Grid.ColumnDefinitions>
                <Label Grid.Column="0" Name="lblCountry" Content="Country/Region" VerticalAlignment="Top"></Label>
                <ComboBox Grid.Column="1" Name="cbCountry" VerticalAlignment="Top" IsEditable="True" ></ComboBox>
            </Grid>
        </Grid>
    </GroupBox>
    <StackPanel Grid.Row="1" Orientation="Horizontal" FlowDirection="LeftToRight">
        <CheckBox Name="chkFullAddress" Margin="5,8,5,5"  Checked="CheckedEnabled" Unchecked="UncheckedEnabled" IsChecked="true"></CheckBox>
        <Label Name="lblFullname" Content="Show this again when name is incomplete or unclear"></Label>
    </StackPanel>
    <StackPanel Grid.Row="2" Orientation="Horizontal" FlowDirection="RightToLeft">
        <Button Name="btnFullnameCancel" Content="Cancel" Margin="10,10,10,10" Width="50" Click="btnCheckAddressCancelClick"></Button>
        <Button Name="btnFullnameOk" Content="Ok" Margin="10,10,10,10" Width="50" Click="btnCheckAddressOkClick"></Button>
    </StackPanel>
</Grid>

Person.cs コード:編集済み

    public string szStreet
    {
        get ;
        set ;
    }

    public string szCityname
    {
        get ;
        set ;
    }
    public string szState { get; set; }
    public int iZip { get; set; }
    public static bool bCheck { get; set; }
    public static bool bCheckFullAddress { get; set; }

メインウィンドウ LostFocusEvent: 編集済み

   private void txtBox1_LostFocus(object sender, RoutedEventArgs e)
    {
        if ((!string.IsNullOrEmpty(txtBox1.Text)) && (!string.IsNullOrWhiteSpace(txtBox1.Text)))
        {
            if (Person.bCheckFullAddress)
            {
                CheckAddressWindow ca = new CheckAddressWindow(txtBox1);

                ca.ShowDialog();
            }
        }

        else
        {
            CheckAddressWindow ca = new CheckAddressWindow(txtBox1);
            ca.chkFullAddress.IsChecked = caObj.chkFullAddress.IsChecked;
            ca.txtCity.Text = txtBox1.Text;
            ca.ShowDialog();

        }
    }

ButtonClick イベント:編集済み

     private void button1_Click(object sender, RoutedEventArgs e)
    {

        caObj.chkFullAddress.IsChecked = (Person.bCheckFullAddress == true) ? true : false;

        if (!string.IsNullOrEmpty(txtBox1.Text.Trim()))
        {
            CheckAddressWindow ca = new CheckAddressWindow(txtBox1);
            ca.chkFullAddress.IsChecked = caObj.chkFullAddress.IsChecked;
            ca.ShowDialog();

        }

        else
        {
            CheckAddressWindow ca = new CheckAddressWindow(txtBox1);
            ca.chkFullAddress.IsChecked = caObj.chkFullAddress.IsChecked;
            ca.ShowDialog();
            ca.txtCity.Text = txtBox1.Text;
        }
    }

CheckAddressWindow.cs:編集済み

        public partial class CheckAddressWindow : Window
{
    public static bool bChecked = true;
    Person objPerson = new Person();
    bool bCheckAddress = true;
    TextBox txt = new TextBox();
    public CheckAddressWindow()
    {
        InitializeComponent();
    }

    public CheckAddressWindow(TextBox txtName)
    {
        InitializeComponent();
        txt = txtName;
         StringCollection objSc = new StringCollection();
        int iLinecount = txt.LineCount;
        for (int iCount = 0; iCount < iLinecount; iCount++)
        {
            objSc.Add(txt.GetLineText(iCount));
        }
        if (objSc.Count.Equals(5))
        {
            objPerson.szStreet = (objSc[0] + objSc[1]).Trim();
            objPerson.szCityname = objSc[2].Trim();
            objPerson.szState = objSc[3].Trim();
            objPerson.iZip = objSc[4].Trim();
        }

        if (objSc.Count.Equals(3))
        {

            objPerson.szStreet = (objSc[0] + objSc[1]).Trim();
            string[] arrName = objSc[2].Split(',', ' ');
            objPerson.szCityname = arrName[0].Trim();
            objPerson.szState = arrName[1].Trim();
            objPerson.iZip = arrName[2].Trim();
        }       
    }

    private void btnCheckAddressCancelClick(object sender, RoutedEventArgs e)
    {
        this.Close();
    }

    private void btnCheckAddressOkClick(object sender, RoutedEventArgs e)
    {
        if (!string.IsNullOrEmpty(txtCity.Text))
        {
            //txt.Text = txtStreet.Text + "\n" + txtCity.Text + "\n" + txtState.Text + "\n" + txtZip.Text + "\n" + cbCountry.SelectedValue;
            objPerson.szStreet = txtStreet.Text.Trim();
            objPerson.szCityname = txtCity.Text.Trim();
            objPerson.szState = txtState.Text.Trim();
            objPerson.iZip = Convert.ToInt32(txtZip.Text.Trim());
            txt.Text = objPerson.szStreet + "\n" +objPerson.szCityname+","+txtState.Text + " " + txtZip.Text;
            if (chkFullAddress.IsChecked == true)
            {
                bCheckAddress = true;
            }
            else
            {
                bCheckAddress = false;
            }
        }
        this.Close();

    }

    private void Window_Loaded_1(object sender, RoutedEventArgs e)
    {
        cbCountry.Items.Add("India");
        cbCountry.Items.Add("US");
        cbCountry.SelectedIndex = 0;
    }

    private void txtStreet_TextChanged(object sender, TextChangedEventArgs e)
    {

    }

    private void CheckedEnabled(object sender, RoutedEventArgs e)
    {
        chkFullAddress.IsChecked = Person.bCheckFullAddress = true;
    }

    private void UncheckedEnabled(object sender, RoutedEventArgs e)
    {
        chkFullAddress.IsChecked = Person.bCheckFullAddress = false;
    }
}

}

mainwindow に入力されたデータまたはテキストを checkaddresswindowxaml にバインドしようとしています... checkAddresswindow が読み込まれるとすぐに、すべてのテキスト フィールドが null であることが表示されます。ボタンをクリックすると、2 つのテキスト ボックスの値がバインドされて表示されます。私の問題は、データを checkAddresswindow にバインドするのが初めてです。これを達成するにはどうすればよいですか。この概念は初めてです。データバインディングは起こりません...私が間違っていた場所と、それを達成するためにコードのどの部分を変更する必要があるか.

4

1 に答える 1

0

アプリを実行すると、デバッグ出力ウィンドウにバインド エラーが表示されますか?

CheckAddressWindow の DataContext を設定している場所がわかりません。そのファイルの XAML の上部を切り取ったと思います。

もう 1 つの問題は、CheckAddressWindow でバインドしている "Person" オブジェクトが、MainWindow で使用されている "Person" オブジェクトと同じでないことです。

MainWindow と CheckAddressWindow の両方がバインドされる Person オブジェクトを含むモデルを用意することをお勧めします。このように、両方のウィンドウが同じ人物を参照しています。

WPF の MVVM アーキテクチャに関する情報とチュートリアルについては、次のリンクを参照してください。

MVVM: 最初から最後までのチュートリアル?

于 2013-07-22T14:45:19.007 に答える