Объявление значений списков и свойств привязки через XAML для настраиваемого элемента управления silverlight - PullRequest
1 голос
/ 01 декабря 2009

Мне кажется, что я упустил что-то очевидное, но при создании пользовательского элемента управления в Silverlight я могу объявить свойства как публичные, и они будут отображаться при создании деклараций XAML, поэтому я легко могу сделать что-то вроде этого:

public class MyControl : UserControl
{
    public string Title {get; set;}
}

А это:

<local:MyControl Title="Hello World" />

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

<local:MyControl Title="People List">
   <local:MyControl.Columns>
      <local:MyControlColumn Heading="Column 1" Binding="{Binding Name}" />
      <local:MyControlColumn Heading="Column 2" Binding="{Binding Age}" />
   </local:MyControl.Columns>
</local:MyControl>

Однако я не понимаю, как заставить это работать в определении класса:

public class MyControl : UserControl
{
    public string Title {get; set;}
    public IEnumerable ItemSource {get; set;}
    public ObservableCollection<MyControlColumn> Columns {get; set;} // ?
}

public class MyControlColumn
{
    public string Heading {get; set;}
    public ??? Binding {get; set;} // ?
}

Может ли кто-нибудь указать мне правильное направление для составления списка и свойств привязки?

1 Ответ

2 голосов
/ 01 декабря 2009

Для коллекции Columns создайте резервную личную переменную для хранения коллекции экземпляров и удалите средство доступа set: -

private ObservableCollection<MyControlColumn> _columns = new ObservableCollection<MyControlColumn>();
public ObservableCollection<MyControlColumn> Columns {get { return _columns; } }

Для свойства Binding похоже, что вам может потребоваться сам тип Binding System.Windows.Data.Binding. Однако я думаю, что мне нужно знать немного больше о том, что вы собираетесь делать с объектом, как только вы его получите.

Вам следует рассмотреть возможность сделать свойство MyControl Title DependencyProperty: -

public string Title
{
    get { return (string)GetValue(TitleProperty); }
    set { SetValue(TitleProperty, value); }
}

public static readonly DependencyProperty TitleProperty =
        DependencyProperty.Register("Title", typeof(string), typeof(MyControl), null);

Аналогично для ItemSource, хотя вам также следует переименовать в ItemsSource, чтобы сохранить соответствие существующим элементам управления.

Не могу не почувствовать, что здесь есть какое-то новое изобретение колеса, разве DataGrid, ListBox или какой-то другой подобный элемент управления не сделали его для вас?

...