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

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

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

 eran otzap01 апр. 2013 г., 01:58
пожалуйста, посмотрите на мой вопросstackoverflow.com/questions/15735830/…

Ответы на вопрос(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>

при условии, что человек

public class Person
{
    public Person(string Name)
    {
        this.Name = Name;
    }
    public string Name { get; set; }
}

К сожалению, вы не можете связатьConstructorParameters, Увидеть обходной путьВот.

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

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

<object ...>
    <x:Arguments>
        oneOrMoreObjectElements
    </x:Arguments>
</object>
 21 авг. 2010 г., 12:43
Хорошо, я рад, что ты поднял этот вопрос.
 22 янв. 2014 г., 22:03
Для всех, кто пришел сюда в поисках именно этого ответа, я сэкономлю вам немного времени, потому что вы собираетесь найти этот пост в следующем:stackoverflow.com/questions/14347181/…
 05 мая 2011 г., 17:15
Еще один пост наwpftutorial.net/XAML2009.html
 29 мар. 2018 г., 21:22
Что это такоеx пространство имен определено как?
 28 июн. 2016 г., 13:47
«В принципе, ни один текущий компилятор (WPF, SL, WinRT) фактически не поддерживает его» - Дункан Мэтисон. Связанный комментарием Кевека, должен быть в ответе.

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

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

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

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

You may have one or more properties which must be set before the object can be used. Two or more properties may be mutually exclusive with each other, e.g., it makes no sense to set both the StreamSource and UriSource of an image. You may want to ensure that a property is only set during initialization. One property may depend on another, which can be tricky due to the aforementioned convention of order independence when setting properties.

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

The default constructor will be called. BeginInit() will be called. Properties will be set in the order they appeared in the XAML declaration. EndInit() is called.

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

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

Ваш ответ на вопрос