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

54

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

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

пожалуйста, посмотрите на мой вопросstackoverflow.com/questions/15735830/… eran otzap

Ваш Ответ

4   ответа
71

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

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

<object ...>
    <x:Arguments>
        oneOrMoreObjectElements
    </x:Arguments>
</object>
Что это такоеx пространство имен определено как?
Для всех, кто пришел сюда в поисках именно этого ответа, я сэкономлю вам немного времени, потому что вы собираетесь найти этот пост в следующем:stackoverflow.com/questions/14347181/…
«В принципе, ни один текущий компилятор (WPF, SL, WinRT) фактически не поддерживает его» - Дункан Мэтисон. Связанный комментарием Кевека, должен быть в ответе.
Хорошо, я рад, что ты поднял этот вопрос.
Еще один пост наwpftutorial.net/XAML2009.html
3

Да, вы можете сделать это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, Увидеть обходной путьВот.

11

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

25

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

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

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

  1. You may have one or more properties which must be set before the object can be used.
  2. 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.
  3. You may want to ensure that a property is only set during initialization.
  4. One property may depend on another, which can be tricky due to the aforementioned convention of order independence when setting properties.

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

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

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

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

Похожие вопросы