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