Как "объединить" файл 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 эти два файла находятся рядом. Что я хотел бы сделать, так это собрать эти два файла вместе, как с элементом управления и его кодом.
что у меня есть:
что я хотел бы иметь:
каков наилучший способ сделать это? Спасибо.
4 ответов
вам нужно отредактировать .файл csproj. Найдите <Compile>
элемент для MyTemplate.cs и добавьте <DependentUpon>
элемент под ним:
<Compile Include="MyTemplate.cs">
<DependentUpon>MyTemplate.xaml</DependentUpon>
</Compile>
см. это сообщение в блоге:сделайте элемент проекта дочерним элементом другого
другой способ:
- добавить/создать новый файл / элемент XAML
- скопируйте и вставьте старый .xaml и xaml.содержимое cs для новых эквивалентных файлов
- удалить отдельные файлы
- переименовать новый файл
Это не ответ на ваш первоначальный вопрос, но для этого:
в этом случае объясните, как добавить обработчик событий в шаблон без использования кода
вы можете сделать это с помощью 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;
}
добавьте экземпляр класса command в класс ViewModel, сделайте его закрытым и предоставьте его через свойство только для чтения:
public class ViewModel
{
private readonly ICommand _command = new Command();
public ICommand Command
{
get { return _command; }
}
}
добавьте ViewModel в качестве статического ресурса в приложение.файл xaml:
<Application.Resources>
<wpfApplication1:ViewModel x:Key="ViewModel"/>
</Application.Resources>
установите DataContext вашего XAML-файла в ViewModel:
<Window DataContext="{StaticResource ViewModel}">
теперь ответьте на ваше событие привязкой к классу команд:
<Button Click="{Binding Command}"></Button>
бум, никакого кода. Надеюсь, это помогает.
если вы действительно чувствуете необходимость комбинировать фрагменты кода с 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;