2016-11-30 2 views
1

Я новичок в WPF и пытаюсь связать текстовое поле, расположенное в главном окне, от пользовательского элемента управления.WPF Bind Текстовое поле в основных окнах из пользовательских элементов управления

<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'? верный? –

ответ

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

В качестве примечания, пожалуйста, используйте правильное обозначение для имен ViewModel UIcontrol для ViewModel это немного сбивает с толку .. :)

+0

Прежде всего, большое спасибо за ваши сильные советы и рекомендации! , Он работает и помогает мне понять проблему. Спасибо также за то время, которое вы потратили на эту коррекцию. – GcH

+0

@GcH. Пожалуйста, отметьте этот ответ как принятый, если вы считаете, что он разрешает вашу проблему. Спасибо –

+0

Извините, но как отметить этот ответ как принято? – GcH