WPF4:如何在主窗口中设置UserControl中的值?

时间:2010-08-30 18:37:50

标签: visual-studio-2010 wpf-4.0

这必须很简单,至少在旧版.Net中可能需要四行代码。我在VS2010,C#,WPF4工作。

我有一个带文本框的用户控件。当我单击主窗口中的按钮时,我希望我的用户控件文本框能够反映一些文本。 WPF4中是否可以使用少于500行的深奥代码?

问题在于,虽然我知道文本框正在从用户控制代码中的断点获取新文本,但该文本永远不会反映到主窗口。主窗口仍显示原始文本。它必须是某种绑定的东西,我真的认为我不应该为这种简单的情况创建模板和资源。它必须是一些简单的东西,我忘了在WPF4的森林里。以下是我所拥有的。单击按钮后,文本框仍为空白;它没有说“你好地球人。”

在用户控制代码中:

public partial class UserControl1 : UserControl
{
    public static readonly DependencyProperty TextProperty;

    public UserControl1()
    {
        InitializeComponent();
    }

    static UserControl1()
    {
        TextProperty = DependencyProperty.Register("Text", typeof(string), typeof(UserControl1), new UIPropertyMetadata(null));
    }

    public string Text
    {
        get { return (string)GetValue(TextProperty); }
        set { SetValue(TextProperty, value); }
    }

}

用户控制xaml:

<UserControl x:Class="WTFUserControlLibrary.UserControl1"
         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">
<Grid Height="164" Width="220">
    <TextBox Name="txtTest" BorderBrush="red" BorderThickness="2" Height="25" Text="{Binding ElementName=UserControl1, Path=Text, Mode=TwoWay}"></TextBox>
</Grid>

(我不知道在这种情况下文本绑定应该做什么。)

主窗口代码:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, RoutedEventArgs e)
    {
        WTFUserControlLibrary.UserControl1 uc = new WTFUserControlLibrary.UserControl1();
        uc.Text = "hello earthlings";
    }
}

和主窗口xaml:

<Window x:Class="WpfApplication2.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:my="clr-namespace:WTFUserControlLibrary;assembly=WTFUserControlLibrary"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="71,65,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    <my:UserControl1 HorizontalAlignment="Left" Margin="71,94,0,0" Name="userControl11" VerticalAlignment="Top" Height="116" Width="244" />
</Grid>

感谢地球人(以及那些设计这个烂摊子的人!)

1 个答案:

答案 0 :(得分:1)

在您的方法button1_Click中,您正在创建 用户控件。这不是窗口中的用户控件,永远不会显示。

相反,请在XAML中为您的usercontrol命名:

x:Name="uc"

然后在button1_Click方法中删除创建新用户控件的第一行。

更新

您希望用户控件XAML看起来更像这样:

<UserControl x:Class="WTFUserControlLibrary.UserControl1"
         x:Name="thisControl"
         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">
<Grid Height="164" Width="220">
    <TextBox Name="txtTest" BorderBrush="red" 
             BorderThickness="2" Height="25" 
             Text="{Binding ElementName=thisControl, Path=Text, Mode=TwoWay}" />
</Grid>

我将x:Name="thisControl"添加到根UserControl元素,然后在绑定中引用它。

我会尝试解释绑定:

您的用户控件中有 文本框,但您希望能够将文本值绑定到用户控件的外部。您所做的是在用户控件上设置依赖项属性,并将该文本框绑定到该属性,因此您使用绑定基础结构将值从UserControl的顶层传递到其中的组成控件。 / p>

基本上,它看起来像这样:

data
    ---> bind UserControl1.Text to data
         ---> bind TextBox.Text to UserControl1.Text