Подтвердить что ты не робот

Как "слить" файл XAML и его код с помощью Visual Studio

У меня есть шаблон, определенный в файле XAML с именем "MyTemplate.xaml". Этот шаблон использует файл с кодом "MyTemplate.cs".

Mytemplate.xaml

<ResourceDictionary x:Class="Project.Templates.MyTemplate">
    <DataTemplate ... />
</ResourceDictionary>

MyTemplate.cs

namespace Project.Templates
{
    public partial class MyTemplate : ResourceDictionary
    {
        ...
    }
}

В обозревателе решений Visual Studio эти два файла находятся рядом друг с другом. То, что я хотел бы сделать, это объединить эти два файла, как с помощью Control и его кода.

Что у меня: enter image description here

Что бы я хотел: enter image description here

Каков наилучший способ сделать это? Спасибо.

4b9b3361

Ответ 2

Это не ответ на ваш первоначальный вопрос, а на следующее:

В этом случае объясните, как добавить обработчик событий в шаблон без использования кода

Вы можете сделать это с помощью класса ViewModel и ICommand.

Сначала вам нужно создать свой класс ViewModel, сделать его общедоступным и нестационарным с конструктором без параметров.

Затем создайте другой класс, который реализует интерфейс ICommand:

public class Command : ICommand
{
    public void Execute(object parameter)
    {
        //this is what happens when you respond to the event
    }

    public bool CanExecute(object parameter)
    {
        return true;
    }

    public event EventHandler CanExecuteChanged;
}

Добавьте экземпляр вашего командного класса в класс ViewModel, сделайте его приватным и выставьте его через свойство только для чтения:

public class ViewModel
{
    private readonly ICommand _command = new Command();

    public ICommand Command
    {
        get { return _command; }
    }
}

Добавьте свой ViewModel в качестве статического ресурса в файл App.xaml:

<Application.Resources>
     <wpfApplication1:ViewModel x:Key="ViewModel"/>
</Application.Resources>

Установите свой DataContext вашего файла XAML в ViewModel:

<Window DataContext="{StaticResource ViewModel}">

Теперь ответьте на свое событие, привязав к классу Command:

<Button Click="{Binding Command}"></Button>

Бум, без кода. Надеюсь, это поможет.

Ответ 3

Другой способ:

  • Добавить/Создать новый файл/элемент XAML
  • Скопируйте и вставьте старый .xaml и xaml.cs контент в новые эквивалентные файлы.
  • удалить отдельные файлы
  • переименуйте новый файл

Ответ 4

Если вы действительно чувствуете необходимость комбинировать фрагменты кода с XAML в WPF, вы можете использовать Attached Properties. Вы можете сохранить XAML в App.Resources и загрузить его и применить его с помощью Attached Property. Я действительно понимаю, что это не даст вам одного файла для XAML и кода позади, но он работает хорошо.

Вы можете зарегистрировать обработчик PropertyChangedCallback в Attached Property и в этом обработчике вы можете применить шаблон:

ControlTemplate controlTemplate = (ControlTemplate)Application.Current.
    FindResource("TextBoxTemplate");
if (textBox.Template != controlTemplate) textBox.Template = controlTemplate;