来自用户控件的主窗口中的WPF绑定文本框

来自用户控件的主窗口中的WPF绑定文本框,wpf,binding,user-controls,datacontext,Wpf,Binding,User Controls,Datacontext,我是WPF新手,正在尝试从用户控件绑定位于mainwindow中的文本框 <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" Widt

我是WPF新手,正在尝试从用户控件绑定位于mainwindow中的文本框

<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>
我的问题:在主窗口中,我使用了一个简单的用户控件。我想从这个用户控件绑定textbox值。 绑定通过主窗口中的按钮进行操作,但用户控件不会执行任何操作。我想DataContexts有些错误,但你能帮我找到正确的方法吗

主窗口后面的代码

 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>
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”>

可能还有很多其他的解决方案,但正如我在评论中所说的,下面的解决方案会起作用,并会让您了解问题所在

仅更新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);
    }
}
公共部分类UC1:UserControl
{
公共UC1()
{
初始化组件();
}
私有模型;
私有无效按钮\u单击(对象发送者,路由目标e)
{
var窗口=FindParent(此);
如果(窗口!=null)
{
var vm=window.DataContext作为UIcontrol;
if(vm!=null)
{
vm.FirstName=“Doe”;
}
其他的
{
viewModel=新UIcontrol();
window.DataContext=viewModel;
viewModel.FirstName=“Doe”;
}
}
}
公共静态T FindParent(DependencyObject子对象),其中T:DependencyObject
{
//获取父项
DependencyObject parentObject=VisualTreeHelper.GetParent(子级);
//我们已经到了树的尽头
if(parentObject==null)返回null;
//检查父项是否与我们要查找的类型匹配
T parent=parentObject作为T;
如果(父项!=null)
返回父母;
其他的
返回FindParent(parentObject);
}
}

作为旁注,请为ViewModel名称使用正确的符号
UIcontrol
,因为ViewModel有点混乱:)

可能还有很多其他的解决方案,但正如我在评论中所说的,下面的解决方案会起作用,并会让您了解问题所在

仅更新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);
    }
}
公共部分类UC1:UserControl
{
公共UC1()
{
初始化组件();
}
私有模型;
私有无效按钮\u单击(对象发送者,路由目标e)
{
var窗口=FindParent(此);
如果(窗口!=null)
{
var vm=window.DataContext作为UIcontrol;
if(vm!=null)
{
vm.FirstName=“Doe”;
}
其他的
{
viewModel=新UIcontrol();
window.DataContext=viewModel;
viewModel.FirstName=“Doe”;
}
}
}
公共静态T FindParent(DependencyObject子对象),其中T:DependencyObject
{
//获取父项
DependencyObject parentObject=VisualTreeHelper.GetParent(子级);
//我们已经到了树的尽头
if(parentObject==null)返回null;
//检查父项是否与我们要查找的类型匹配
T parent=parentObject作为T;
如果(父项!=null)
返回父母;
其他的
返回FindParent(parentObject);
}
}

作为旁注,请为ViewModel名称使用正确的符号
UIcontrol
,因为ViewModel有点混乱:)

你能分享UC1的XAML吗?UC1 XAML她据我所知,你看到的是
Mike
,而不是
Doe
?正确吗?这当然是我的问题。这是因为您正在设置UC1的datacontext而不是父窗口,这可以通过不同的方式完成,我将很快分享一个示例。您可以分享UC1的XAML吗?UC1 XAML Her根据我的理解,您看到的是
Mike
,而不是
Doe
?正确吗?这当然是我的问题。这是因为您正在设置UC1的datacontext而不是父窗口,这可以通过不同的方式完成,我将很快分享一个示例。首先,非常感谢您的大力帮助和建议。它可以帮助我理解这个问题。也感谢您为此花费的时间correction@GcH,不客气,如果您认为此答案可以解决您的问题,请将其标记为已接受。Thanks@GcH,您可能想了解一下。首先,非常感谢您的大力帮助和建议。它可以帮助我理解这个问题。也感谢您为此花费的时间correction@GcH,不客气,如果您认为此答案可以解决您的问题,请将其标记为已接受。Thanks@GcH,你可能想调查一下