如何从另一个类访问控件?

时间:2010-11-02 11:14:58

标签: c# wpf

假设我有一个用户控件test1.xaml并且有一个帧控件名称frame1。在我的第二个用户控件上,如何在test2.xaml中引用test1.xaml以便在test2.xaml.cs中操作控件的属性?因为我知道test1 test = new test1();将无法正常工作,因为我没有实例化它并且没有引用它。我可以问怎么样?

3 个答案:

答案 0 :(得分:2)

在MVVM方法中,两个视图/用户控件都可以使用与数据绑定的视图模型相同的视图模型。现在,当第一个控件导致该视图模型公开的某个属性发生值更改时,这将自动反映在第二个用户控件中。

答案 1 :(得分:1)

确定。我不会用DependencyProperties编写代码,因为它闻起来很香。我将编写一个简单的代码,使用MVVM完成这些工作。但我想指出,您必须阅读Josh Smith撰写的文章“使用模型 - 视图 - ViewModel设计模式的WPF应用程序”。 这是一个简单的代码,它包含一个主窗口和两个用户控件Test1和Test2。并且只有一个ViewModel - GodViewModel,它是Test1和Test2的viewModel。实际上,ViewModel和View之间通常有1-1映射。为简单起见,我只创建了一个ViewModel。

窗口代码:

<Window x:Class="WpfApplication99.MainWindow"
        x:Name="GodWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:view="clr-namespace:WpfApplication99.View"
        Title="MainWindow"
        xmlns:local="clr-namespace:WpfApplication99"
        DataContext="{Binding Vm, ElementName=GodWindow}">
    <StackPanel>
        <view:Test1 />
        <view:Test2 />
    </StackPanel>
</Window>

public partial class MainWindow : Window
{
    ViewModel.GodViewModel _vm = new ViewModel.GodViewModel();

    public ViewModel.GodViewModel Vm
    {
        get { return _vm; }
        set { _vm = value; }
    }

    public MainWindow()
    {
        InitializeComponent();
    }
}

ViewModel代码:

namespace WpfApplication99.ViewModel
{
    public class GodViewModel
    {
        public string Text { get; set; }
    }
}

test1代码(后面的代码是空的):

<UserControl x:Class="WpfApplication99.View.Test1"
             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="45" d:DesignWidth="167">

        <Button Content="{Binding Text}"
                Height="26" 
                Name="button1"
                Width="144" />
</UserControl>

test2代码(后面的代码是空的):

<UserControl x:Class="WpfApplication99.View.Test2"
             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" >
        <TextBox Text="{Binding Text}" Height="69" Width="232" />
</UserControl>

使用此代码,您可以在Test1和Test2中使用相同的属性Text。在你的问题中,你写道你在test1中有一个属性,并希望在test2中使用它。因此,假设提供的解决方案只是将test1的一个属性Text放入GodViewModel中。 也许,你想在后面的代码中使用它。在这种情况下,您应该为test1和test2用户控件创建单独的ViewModel。我无法描述那里的所有细节。所以,请阅读这篇文章。我确信MVVM模式是WPF中的关键。

答案 2 :(得分:0)

您可以将YourViewModelBase类型的DependencyProperty添加到test2。比在你创建控件实例的地方写一些。当然,如果你使用MVVM。但是,据我所知,根据MVVM,你不应该做那样的事情。 如果你没有YourViewModelBase,你可以为test1创建一个具有必要属性的抽象类,或者只是将test1作为UserControl传递,然后尝试将它强制转换为test2代码中的test1。