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

Вызов параметризованного конструктора из XAML

При использовании WPF я заметил, что когда я добавляю элемент управления в файл XAML, вызывается конструктор по умолчанию.

Есть ли способ вызвать параметризованный конструктор?

4b9b3361

Ответ 1

.NET 4.0 добавляет новую функцию, которая бросает вызов.

x: Аргументы Директивы

<object ...>
    <x:Arguments>
        oneOrMoreObjectElements
    </x:Arguments>
</object>

Ответ 2

Я понимаю, что опаздываю на вечеринку здесь, но, поскольку никто не обращался к соглашениям WPF, я думал, что буду звонить.

Одним из основных принципов XAML-дружественных объектов является то, что они должны полностью использоваться конструктором по умолчанию, т.е. нет поведения, доступного только при использовании конструктора, отличного от стандартного. Чтобы соответствовать декларативному характеру XAML, параметры объекта задаются с помощью средств определения свойств. Существует также соглашение, в котором говорится, что порядок, в котором свойства установлены в XAML, не должен быть важен.

Однако у вас могут быть некоторые особые соображения, которые важны для вашей реализации, но не согласуются с конвенцией:

  • У вас может быть одно или несколько свойств, которые должны быть установлены до того, как объект будет использоваться.
  • Два или более свойства могут быть взаимоисключающими друг с другом, например, нет смысла устанавливать как StreamSource, так и UriSource изображения.
  • Вы можете убедиться, что свойство задано только во время инициализации.
  • Одно свойство может зависеть от другого, что может быть сложно из-за вышеупомянутого соглашения о независимости порядка при настройке свойств.

Чтобы упростить обработку этих случаев, предоставляется интерфейс ISupportInitialize. Когда объект считывается и создается из XAML (т.е. Анализируется), объекты, реализующие ISupportInitialize, будут обрабатываться специально:

  • Будет вызываться конструктор по умолчанию.
  • BeginInit() будет вызываться.
  • Свойства будут установлены в том порядке, в котором они появились в объявлении XAML.
  • EndInit().

Отслеживая вызовы на BeginInit() и EndInit(), вы можете обрабатывать все правила, которые вам нужно навязывать, включая требование о том, чтобы определенные свойства были установлены. Вот как вы должны обрабатывать параметры создания; не требуя аргументов конструктора.

Обратите внимание, что также указан ISupportInitializeNotification, который расширяет указанный интерфейс, добавляя свойство IsInitialized и Initialized. Я рекомендую использовать расширенную версию.

Ответ 3

Нет. Не из XAML [при использовании WPF].

Ответ 4

Да, вы можете сделать это с помощью 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. См. Обходное решение здесь.