Как получить доступ к элементам управления из другого класса? - PullRequest
2 голосов
/ 02 ноября 2010

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

Ответы [ 3 ]

2 голосов
/ 02 ноября 2010

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

1 голос
/ 03 ноября 2010

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

Используя этот код, вы можете использовать одно и то же свойство Text в Test1 и Test2.В своем вопросе вы написали, что у вас есть свойство в test1 и вы хотите использовать его в test2.Итак, представьте, что предоставленное решение просто поместит одно свойство Text test1 в GodViewModel.Возможно, вы хотите использовать его в коде позади.В этом случае вам следует создать отдельную ViewModel для пользовательских элементов управления test1 и test2.Я не могу описать все детали там.Итак, пожалуйста, прочитайте статью.Я уверен, что шаблон MVVM - ключевая вещь в WPF.

0 голосов
/ 02 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...