2010-11-02 5 views
2

Предположим, что у меня есть пользовательский контроль test1.xaml и имеет frame frame frame frame. На моем втором пользовательском элементе управления, как мне ссылаться на test1.xaml в моем test2.xaml, чтобы управлять свойством элемента управления в test2.xaml.cs? Потому что я знаю, что test1 test = new test1(); не будет работать, потому что я не создавал экземпляр и не ссылался на него. Могу я спросить, как?Как получить доступ к элементам управления из другого класса?

ответ

1

Хорошо. Я не буду писать код с DependencyProperties, потому что он пахнет. Я напишу вместо этого простой код, который делает такие вещи, используя MVVM. Но я хочу отметить, что Джош Смит должен прочитать статью «Приложения WPF с шаблоном проектирования Model-View-ViewModel». Вот простой код, который содержит одно главное окно и два пользовательских элемента управления Test1 и Test2. И только один ViewModel - GodViewModel, который является viewModel для Test1 и Test2. На самом деле, как правило, имеется отображение 1-1 между ViewModel и View. Для простоты я создал только один 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. В вашем вопросе вы написали, что у вас есть свойство в test1 и хотите использовать его в test2. Итак, представьте, что предоставленное решение просто поместило одно свойство test1 в текст в GodViewModel. Возможно, вы хотите использовать его в коде позади. В этом случае вы должны создать отдельный элемент управления ViewModel для test1 и test2. Я не могу описать все детали там. Итак, прочитайте статью. Я уверен, что шаблон MVVM является ключевым в WPF.

+0

Спасибо за ваше время и исходный код! Я оценил это –

0

Вы можете добавить DependencyProperty типа YourViewModelBase к вашему test2. Затем напишите в том месте, где вы создаете экземпляр своих элементов управления. Конечно, если вы используете MVVM. Однако, насколько я понимаю, вы не должны так поступать в соответствии с MVVM. , если у вас нет YourViewModelBase, вы можете создать абстрактный класс для вашего теста1 с необходимыми свойствами или просто пройти test1 как UserControl, а затем попытаться передать его test1 в свой код test2.

+0

Привет, спасибо за ваш ответ. вы могли бы привести пример кода для реализации этого –

2

В подходе MVVM оба представления/пользовательские элементы управления могут использовать одну и ту же модель представления, к которой привязаны данные. Теперь, когда первый элемент управления вызывает изменение значения в одном из свойств, выставленных этой моделью просмотра, это автоматически отражается во втором пользовательском элементе управления.

+0

Я не уверен, что я уже использую MVVM, но я уже разделял файлы в соответствии с их папками. Я пытаюсь реализовать MVVM. –

Смежные вопросы