2013-07-22 42 views
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> 

CheckAddressWindow XAML:

 <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; 
    } 
} 

}

我想結合在主窗口,以checkaddresswindowxaml輸入的數據或文本.. 。一旦checkAddresswindow加載它,如果我輸入了一些數據,那麼顯示所有的文本都是空的n checkaddress feild然後單擊確定按鈕它將顯示mainwindow。在mainWindow中,當單擊按鈕時它將綁定並顯示兩個文本框值。我首次將它的綁定數據發送到checkAddresswindow.How我可以實現this.am new to這個概念。如果我確實犯了錯誤,請糾正我。 數據綁定不會發生......我錯了什麼地方,我需要更改哪部分代碼才能實現它。

+0

@Sheridan我怎麼能在CheckAddressWindow.Can每個文本框設置的DataContextü請讓我知道的結合正確的方法WF – kida

+0

@sheridan嗨,我已經編輯了上面的code.now它工作正如我所需要的,但你可以建議我更好的方式綁定數據在WPF中。 – kida

回答

0

運行您的應用程序時,是否在調試輸出窗口中看到任何綁定錯誤?

我沒有看到你爲你的CheckAddressWindow設置DataContext。我認爲你切斷了該文件的XAML的頂部。

另一個問題可能是您在CheckAddressWindow中綁定的「Person」對象與MainWindow使用的「Person」對象不同。

我建議你有一個Model,它包含一個Person對象,MainWindow和CheckAddressWindow都綁定到該對象。這樣,兩個窗口都指的是同一個人。

對於信息和教程MVVM架構WPF,請訪問以下鏈接:

MVVM: Tutorial from start to finish?

+0

嗨,我已經編輯了上面的代碼,現在它按照我的要求工作,但是可以建議我在WPF中更好地綁定數據的方式。請向我展示一些鏈接,以瞭解和實現MVVM結構。 – kida

+0

我已經在上面添加了一個鏈接來幫助您使用MVVM的教程。 – Curtis

相關問題