2010-11-02 57 views
2

比方說,我有一個用戶控件test1.xaml,並有一個框架控件名稱frame1。在我的第二個用戶控件上,如何引用test2.xaml中的test1.xaml以便操作test2.xaml.cs中的控件屬性?因爲我知道test1 test = new test1();將不會工作,因爲我沒有實例化它,並沒有引用它。我可以問一下嗎?如何從另一個類訪問控件?

回答

1

好的。我不會用DependencyProperties編寫代碼,因爲它有異味。我會寫一個簡單的代碼,使用MVVM來做這樣的事情。但是我想指出的是,您必須閱讀Josh Smith撰寫的一篇文章「使用Model-View-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(); 
    } 
} 

視圖模型的代碼:

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中的關鍵。

+0

感謝您的時間和源代碼!我讚賞它 – 2010-11-03 17:13:51

0

您可以將YourViewModelBase類型的DependencyProperty添加到您的test2。在你創建控件實例的地方寫一些東西。當然,如果你使用MVVM。不過,據我瞭解,根據MVVM你不應該這樣做。 如果你沒有YourViewModelBase,你可以爲你的test1創建一個具有必要屬性的抽象類,或者只是將test1作爲UserControl傳遞,然後嘗試將它轉換到test2代碼中的test1。

+0

嗨,謝謝你的回覆。你能否提供一個示例代碼來說明如何實現這個 – 2010-11-02 16:15:46

2

在MVVM方法中,視圖/用戶控件都可以使用與數據綁定的相同視圖模型。現在,當第一個控件引起該視圖模型公開的其中一個屬性發生值更改時,它會自動反映到第二個用戶控件中。

+0

我不確定我是否已經使用MVVM,但是我已經根據它們的文件夾分離了這些文件。我試圖實現MVVM。 – 2010-11-02 16:16:09