2016-11-30 88 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"); 
      } 
     } 
    } 


} 

我的问题:在这个主窗口中我用了一个简单的用户控制。我想要绑定来自此用户控件的文本框值。 绑定通过mainwindow中的按钮进行操作,但是用户控件没有任何反应。我认为datacontextis错了,但你能帮我找到正确的方法。在主窗口后面

代码

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

我的理解是你正在看“Mike”而不是“Doe”?正确? –

回答

0

可能有很多其他的解决方案,但正如我所说在我的评论下面的解决方案将工作,并会给你一个问题的想法。

在UC1代码

只有更新背后

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

作为一个侧面说明,请使用正确的符号来表示视图模型名称UIcontrol的视图模型是有点混乱.. :)

+0

首先,非常感谢您的有力帮助和注释建议! 。它的工作原理和帮助我了解问题。也感谢您为这次更正所花费的时间 – GcH

+0

@GcH,欢迎您,如果您认为它解决了您的问题,请将此答案标记为已接受。谢谢 –

+0

对不起,但如何将此答案标记为已接受? – GcH