2014-06-05 2 views
1

나는 그리드에서 하나씩 버튼과 텍스트 상자를 동적으로 생성합니다. 내 요구 사항은, 버튼을 클릭하면 팝업이 표시됩니다. 그리고 만약 내가 팝업에서 값을 선택, 나는 해당 행의 텍스트 상자를 바인딩해야합니다. 예를 들어, 다섯 번째 행의 버튼을 클릭하면 팝업 항목 값을 다섯 번째 행 텍스트 상자에 바인딩해야합니다. 해당 행의 텍스트 상자에 바인딩 값을 쳤다. 이것은 간단한 하나일지도 모르지만 나는 이것을 할 수 없다. 이 내 코드,동적으로 생성 된 텍스트 상자에 팝업 값을 바인딩하는 방법은 무엇입니까?

XAML :.

<Button x:Name="btn_addnewrow" Content="Add" HorizontalAlignment="Left" Margin="50,40,0,0" VerticalAlignment="Top" Width="89" Height="31" Click="btn_addnewrow_Click"/> 
    <Popup Name="popup" IsOpen="False" Placement="Mouse" VerticalOffset="15" HorizontalOffset="0" Margin="124,122,107,65"> 
     <Border BorderBrush="Black" BorderThickness="1" Background="Coral"> 
      <StackPanel Orientation="Horizontal" Height="143"> 
       <ListView Margin="10,10,0,0" Name="ListView1" HorizontalAlignment="Left" 
        VerticalAlignment="Top" Width="194" Height="133" MouseDoubleClick="ListView1_MouseDoubleClick"> 
        <ListViewItem Content="Coffie"></ListViewItem> 
        <ListViewItem Content="Tea"></ListViewItem> 
        <ListViewItem Content="Orange Juice"></ListViewItem> 
        <ListViewItem Content="Milk"></ListViewItem> 
        <ListViewItem Content="Iced Tea"></ListViewItem> 
        <ListViewItem Content="Mango Shake"></ListViewItem> 
       </ListView> 

      </StackPanel> 
     </Border> 
    </Popup> 

CS :

public int count = 0; 
    public Button btn1; 
    public Button btn2; 
    public TextBox txt1; 

    private void btn_addnewrow_Click(object sender, RoutedEventArgs e) 
    { 
     //Creating Rows.. 
     RowDefinition row0 = new RowDefinition(); 
     row0.Height = new GridLength(40); 
     grid1.RowDefinitions.Add(row0); 

     //Creating columns.. 
     ColumnDefinition col0 = new ColumnDefinition(); 
     ColumnDefinition col1 = new ColumnDefinition(); 
     ColumnDefinition col2 = new ColumnDefinition(); 

     col0.Width = new GridLength(50); 
     col1.Width = new GridLength(100); 
     col2.Width = new GridLength(70); 


     grid1.ColumnDefinitions.Add(col0); 
     grid1.ColumnDefinitions.Add(col1); 
     grid1.ColumnDefinitions.Add(col2); 

     int i = count; 

     ////1st Column button 
     btn1 = new Button(); 
     btn1.Margin = new Thickness(10, 10, 0, 0); 
     btn1.BorderThickness = new Thickness(0); 
     Grid.SetRow(btn1, i); 
     Grid.SetColumn(btn1, 0); 
     btn1.Tag = btn1; 
     btn1.Click += btnBindList_Click; 
     grid1.Children.Add(btn1);   

     //2nd column Textbox 
     txt1 = new TextBox(); 
     txt1.Margin = new Thickness(10, 10, 0, 0); 
     txt1.Name = "txt" + i; 
     Grid.SetRow(txt1, i); 
     Grid.SetColumn(txt1, 1); 
     txt1.Tag = txt1; 
     grid1.Children.Add(txt1); 

     count++; 
    } 

    private void btnBindList_Click(object sender, RoutedEventArgs e) 
    { 
      ? 
      ? 
     popup.IsOpen = true; 
    } 

    private void ListView1_MouseDoubleClick(object sender, RoutedEventArgs e) 
    { 
     txt1.Text = (ListView1.SelectedItem as ListViewItem).Content.ToString(); 
     popup.IsOpen = false; 
    } 

답변

0

버튼, 텍스트 상자 및 팝업와 UserControl을 만듭니다. 이 사용자 정의 컨트롤은 셀 템플릿 또는 gridview 또는 listview의 항목 템플릿으로 설정해야합니다. 텍스트 상자는 popup listview의 선택된 값에 바인딩됩니다. 따라서 사용자가 팝업을 열고 값을 선택하면 선택한 값이 해당 텍스트 상자에서 업데이트됩니다.

<Grid HorizontalAlignment="Left"> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition Width="Auto"/> 
    </Grid.ColumnDefinitions> 
    <TextBox Text="{Binding ElementName=ListView1, Path=SelectedValue.Content}" Width="200" VerticalAlignment="Top" HorizontalAlignment="Left" Margin="2"/> 
    <ToggleButton Content="Select" Grid.Column="1" HorizontalAlignment="Left" Margin="2" x:Name="btn"/> 
    <Popup PlacementTarget="{Binding ElementName=btn}" Placement="Bottom" 
      StaysOpen="False" 
      IsOpen="{Binding ElementName=btn, Path=IsChecked}"> 
     <ListView Name="ListView1" 
        HorizontalAlignment="Left" 
        VerticalAlignment="Top" 
        Width="194" 
        Height="133"> 
      <ListViewItem Content="Coffie"></ListViewItem> 
      <ListViewItem Content="Tea"></ListViewItem> 
      <ListViewItem Content="Orange Juice"></ListViewItem> 
      <ListViewItem Content="Milk"></ListViewItem> 
      <ListViewItem Content="Iced Tea"></ListViewItem> 
      <ListViewItem Content="Mango Shake"></ListViewItem> 
     </ListView> 
    </Popup> 
</Grid> 
+0

저는 텍스트 상자와 버튼을 동적으로 생성합니다. 이 코드는 나를 위해 작동하지 않습니다 – JohnPaul

0

바인딩을 사용하려면 클래스 인 뷰 모델을 만들어야합니다. Button 및 TextBox에 바인딩합니다. 버튼을 클릭하면 viewmodel을 가져 와서 listview에서 선택하여 값을 설정합니다.

코드는 매우 혼란 스럽지만 직접 디버깅하고 다시 작성할 수 있습니다.

public int count = 0; 
    public Button btn1; 
    public Button btn2; 
    public TextBox txt1; 

    private void btn_addnewrow_Click(object sender, RoutedEventArgs e) 
    { 
     //Creating Rows.. 
     RowDefinition row0 = new RowDefinition(); 
     row0.Height = new GridLength(40); 
     grid1.RowDefinitions.Add(row0); 

     //Creating columns.. 
     ColumnDefinition col0 = new ColumnDefinition(); 
     ColumnDefinition col1 = new ColumnDefinition(); 
     ColumnDefinition col2 = new ColumnDefinition(); 

     col0.Width = new GridLength(50); 
     col1.Width = new GridLength(100); 
     col2.Width = new GridLength(70); 


     grid1.ColumnDefinitions.Add(col0); 
     grid1.ColumnDefinitions.Add(col1); 
     grid1.ColumnDefinitions.Add(col2); 

     int i = count; 
     Test t = new Test(); 
     ////1st Column button 
     btn1 = new Button(); 
     btn1.Margin = new Thickness(10, 10, 0, 0); 
     btn1.BorderThickness = new Thickness(0); 
     Grid.SetRow(btn1, i); 
     Grid.SetColumn(btn1, 0); 
     Binding binding = new Binding(); 
     binding.Source = t; 
     btn1.SetBinding(Button.TagProperty, binding); 
     btn1.Click += btnBindList_Click; 
     grid1.Children.Add(btn1); 

     Binding binding1 = new Binding("Content"); 
     binding1.Source = t; 
     //2nd column Textbox 
     txt1 = new TextBox(); 
     txt1.Margin = new Thickness(10, 10, 0, 0); 
     txt1.Name = "txt" + i; 
     txt1.SetBinding(TextBox.TextProperty, binding1); 
     Grid.SetRow(txt1, i); 
     Grid.SetColumn(txt1, 1); 
     txt1.Tag = txt1; 
     grid1.Children.Add(txt1); 

     count++; 
    } 

    private void btnBindList_Click(object sender, RoutedEventArgs e) 
    { 

     popup.IsOpen = true; 
     t = ((Button)sender).Tag as Test; 
    } 
    Test t; 
    private void ListView1_MouseDoubleClick(object sender, RoutedEventArgs e) 
    { 
     t.Content = (ListView1.SelectedItem as ListViewItem).Content.ToString(); 
     popup.IsOpen = false; 
    } 
} 

class Test : INotifyPropertyChanged 
{ 
    private string content; 

    public string Content 
    { 
     get { return content; } 
     set 
     { 
      content = value; 
      OnPropertyChanged("Content"); 
     } 
    } 


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

이 작동하지 않습니다 – JohnPaul

+0

코드가 너무 이상하게 보입니다. – JohnPaul

관련 문제