При использовании WPF я заметил, что когда я добавляю элемент управления в файл XAML, вызывается конструктор по умолчанию.
Есть ли способ вызвать параметризованный конструктор?
При использовании WPF я заметил, что когда я добавляю элемент управления в файл XAML, вызывается конструктор по умолчанию.
Есть ли способ вызвать параметризованный конструктор?
.NET 4.0 добавляет новую функцию, которая бросает вызов.
<object ...>
<x:Arguments>
oneOrMoreObjectElements
</x:Arguments>
</object>
Я понимаю, что опаздываю на вечеринку здесь, но, поскольку никто не обращался к соглашениям WPF, я думал, что буду звонить.
Одним из основных принципов XAML-дружественных объектов является то, что они должны полностью использоваться конструктором по умолчанию, т.е. нет поведения, доступного только при использовании конструктора, отличного от стандартного. Чтобы соответствовать декларативному характеру XAML, параметры объекта задаются с помощью средств определения свойств. Существует также соглашение, в котором говорится, что порядок, в котором свойства установлены в XAML, не должен быть важен.
Однако у вас могут быть некоторые особые соображения, которые важны для вашей реализации, но не согласуются с конвенцией:
StreamSource
, так и UriSource
изображения.Чтобы упростить обработку этих случаев, предоставляется интерфейс ISupportInitialize
. Когда объект считывается и создается из XAML (т.е. Анализируется), объекты, реализующие ISupportInitialize
, будут обрабатываться специально:
BeginInit()
будет вызываться.EndInit()
.Отслеживая вызовы на BeginInit()
и EndInit()
, вы можете обрабатывать все правила, которые вам нужно навязывать, включая требование о том, чтобы определенные свойства были установлены. Вот как вы должны обрабатывать параметры создания; не требуя аргументов конструктора.
Обратите внимание, что также указан ISupportInitializeNotification
, который расширяет указанный интерфейс, добавляя свойство IsInitialized
и Initialized
. Я рекомендую использовать расширенную версию.
Нет. Не из XAML [при использовании WPF].
Да, вы можете сделать это с помощью ObjectDataProvider
. Он позволяет вызывать нестандартный конструктор, например:
<Grid>
<Grid.Resources>
<ObjectDataProvider x:Key="myDataSource"
ObjectType="{x:Type local:Person}">
<ObjectDataProvider.ConstructorParameters>
<system:String>Joe</system:String>
</ObjectDataProvider.ConstructorParameters>
</ObjectDataProvider>
</Grid.Resources>
<Label Content="{Binding Source={StaticResource myDataSource}, Path=Name}"></Label>
</Grid>
предполагая, что Person
public class Person
{
public Person(string Name)
{
this.Name = Name;
}
public string Name { get; set; }
}
К сожалению, вы не можете привязать ConstructorParameters
. См. Обходное решение здесь.