как передать параметр в конструкторе управления wpf? - PullRequest
7 голосов
/ 26 декабря 2011

Я написал свой элемент управления и пытаюсь передать параметр для дополнительной инициализации, но есть ошибки = ((ТИП Ajustcontrol не может иметь имя атрибута). Как правильно передать данные? это мой код в C #:

public AjustControl(BaoC input)
        {
            InitializeComponent();

            populateAdjustControl(input);

        }

Ошибка: ошибка 15 Тип «AjustControl» не может иметь атрибута «Имя». Типы значений и типы без конструктора по умолчанию могут использоваться как элементы в ResourceDictionary. Строка 470, позиция 26. D: \ Prj \ aaa \ MainWindow.xaml 470 26 Studio

Ответы [ 2 ]

21 голосов
/ 26 декабря 2011

Итак, как говорит ошибка. Вы не можете иметь элементы управления без конструктора без параметров в xaml. Вы все еще можете добавить его, если хотите создать его экземпляр из кода, но xaml не будет вызывать этот конструктор.

public AjustControl(BaoC input) : this()
{
    populateAdjustControl(input);
}

public AjustControl()
{
    InitializeComponent();
}

Однако, если вы хотите добавить пользовательское свойство в свой элемент управления, вы можете добавить DependancyProperty .

public static readonly DependencyProperty NameProperty= 
    DependencyProperty.Register(
    "Name", typeof(string),
...
    );
public string Name
{
    get { return (string)GetValue(NameProperty); }
    set { SetValue(NameProperty, value); }
}

После этого вы можете использовать свой контроль как

<custom:AjustControl Name="something" />
1 голос
/ 01 декабря 2016

Из вашего вопроса не понятно, зачем передавать параметр конструктору пользовательского элемента управления.

  1. Это может быть связано с тем, что вам необходим пользовательский элемент управления для использования параметра-нарушителя до того, как любые связанные значения будут переданы из пользовательского элемента управления в родительский элемент с помощью механизмов свойств зависимостей - в первую очередь связанных свойств, которые непосредственно или косвенно будут использовать параметр-нарушитель-конструктор .

  2. Это может быть потому, что инициализация с помощью параметризованного конструктора является единственным способом для вас по тем или иным причинам.

Я не знаю ни одного решения для случая 2. Но когда возникает этот вопрос, случай 1 является обычным требованием. В этом случае мое решение состоит в том, чтобы создать обычное свойство dot Net. Это будет решено до любого свойства зависимости.

Но может быть проблема с обычным свойством dot Net. Как вы привязываетесь к ссылке? Элемент управления в визуальном дереве, например, Для этого есть решение, но оно доступно только в более новой версии XAML. Вы можете написать

<MyCustomControl MyParameter="{x:Reference Name=Blah}"/>

вместо

<MyCustomControl MyNonParameter="{Binding ElementName=Blah}"/>

И вам не нужно создавать DP для этого. В вашем контроле Custrom вы можете просто написать

class MyCustomControl {
    // The parameter my constructor sadly can not have
    public MyParameterType MyParameter { get; set; }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...