2016-11-30 3 views
1

WPF에서 새로운 기능이며 사용자 콘트롤에서 mainwindow에 위치한 텍스트 박스를 바인딩하려고합니다.WPF 사용자 콘트롤의 메인 윈도우에서 텍스트 상자 바인딩하기

<Window x:Class="Databinding.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="360" Width="490"> 
<Grid HorizontalAlignment="Left" Width="480"> 
    <TextBox x:Name="EventTitle" HorizontalAlignment="Left" Height="23" Margin="40,19,0,0" TextWrapping="Wrap" Text="{Binding Path=FirstName}" VerticalAlignment="Top" Width="120"/> 
    <Button Content="Button" HorizontalAlignment="Left" Margin="195,20,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/> 
    <StackPanel x:Name="Stck_Main" HorizontalAlignment="Left" Height="230" Margin="22,75,0,0" VerticalAlignment="Top" Width="439"/> 
    <Button Content="UC" HorizontalAlignment="Left" Margin="371,20,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/> 

</Grid> 

또한 값 업데이 트를

class UIcontrol : INotifyPropertyChanged 

{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private string _firstName; 

    protected void Notify(string propertyName) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      if (value != _firstName) 
      { 
       _firstName = value; 
       Notify("FirstName"); 
      } 
     } 
    } 


} 

내 질문을 관리하는 클래스를 생성 : 메인 창 내부 나는 간단한 사용자 컨트롤을 사용했다. 이 사용자 정의 컨트롤에서 텍스트 상자 값을 바인딩하고 싶습니다. 바인딩은 메인 윈도우의 버튼에서 작동하지만 사용자 정의 컨트롤에서 아무런 변화가 없습니다. 나는 datacontextis가 어딘가에 잘못한 것 같지만, 올바른 방법을 찾도록 도와주세요. MainWindow를 뒤에

코드는

public partial class MainWindow : Window 
{ 
    private UIcontrol viewModel; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     viewModel = new UIcontrol(); 
     DataContext = viewModel; 
     viewModel.FirstName = "Mike"; 
    } 

    private void Button_Click_1(object sender, RoutedEventArgs e) 
    { 
     UC1 myUC = new UC1(); 
     Stck_Main.Children.Clear(); 
     Stck_Main.Children.Add(myUC); 
    } 

} 

사용자 제어 코드 뒤에

public partial class UC1 : UserControl 
{ 

    private UIcontrol viewModel; 

    public UC1() 
    { 
     InitializeComponent(); 
    } 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     viewModel = new UIcontrol(); 
     DataContext = viewModel; 
     viewModel.FirstName = "Doe"; 
    } 


} 

이며 XAML의 :

UserControl x:Class="Databinding.UC1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="300" d:DesignWidth="300"> 
<Grid Margin="0,0,10,43"> 
    <Canvas Height="194" Margin="25,30,71,0" VerticalAlignment="Top" Background="White"> 
     <Button Content="Button" Canvas.Left="100" Canvas.Top="81" Width="75" Click="Button_Click" /> 
    </Canvas> 
</Grid> 
+0

당신의 XAML 공유 시겠어요 UC1? –

+0

UC1 xaml herunder – GcH

+0

당신은'Doe'가 아니라'Mike'를보고 있습니다. 옳은? –

답변

0

이 많은 다른 솔루션 수 있지만 내가 말했듯이 수 내 의견을 다음 솔루션을 작동합니다 및 문제의 아이디어를 줄 것이다. 보조 노트로

public partial class UC1 : UserControl 
{ 
    public UC1() 
    { 
     InitializeComponent(); 
    } 

    private UIcontrol viewModel; 

    private void Button_Click(object sender, RoutedEventArgs e) 
    { 
     var window = FindParent<Window>(this); 

     if(window != null) 
     { 
      var vm = window.DataContext as UIcontrol; 
      if(vm != null) 
      { 
       vm.FirstName = "Doe"; 
      } 
      else 
      { 
       viewModel = new UIcontrol(); 
       window.DataContext = viewModel; 
       viewModel.FirstName = "Doe"; 
      } 
     } 
    } 

    public static T FindParent<T>(DependencyObject child) where T : DependencyObject 
    { 
     //get parent item 
     DependencyObject parentObject = VisualTreeHelper.GetParent(child); 

     //we've reached the end of the tree 
     if (parentObject == null) return null; 

     //check if the parent matches the type we're looking for 
     T parent = parentObject as T; 
     if (parent != null) 
      return parent; 
     else 
      return FindParent<T>(parentObject); 
    } 
} 

뒤에 UC1 코드

만 업데이트 뷰 모델에 대한 UIcontrol 비트 혼란 뷰 모델 이름에 대한 올바른 표기법을 사용하시기 바랍니다 .. :)

+0

우선, 귀하의 강력한 도움과 표기 조언에 대해 많은 감사를드립니다! . 그것은 작동하고 문제를 이해하는 데 도움이됩니다. 이 수정을 위해 시간을내어 주셔서 감사합니다. – GcH

+0

@GcH, 귀하는 환영합니다. 귀하의 문제를 해결한다고 생각되면이 답변을 허용으로 표시해주십시오. 감사합니다 –

+0

죄송합니다,이 답변을 수락 한 것으로 표시하는 방법은 무엇입니까? – GcH