2015-06-15 5 views
0

Создаю пользовательский элемент управления. это имеет dependencypoperty этого типаКак установить список элементов пользовательского контроля в XAML

List<CustomSubMenuItem> 

и CustomSubMeuItem

class CustomSubMenuItem 
{ 
public string Title {get;set;} 
public Color BackColor {get;set;} 
publiv Visibility ItemVisibility {get;set;} 
public ICommand Command {get;set;} 
} 

в XAML я связываться с prperty в usuall. но я не могу сделать эти элементы в XAML, например ContextMenu или ListBoxItems.

<MyControl> 
<MyControl.Items> 
<CustomSubMenuItem Title="First" Visibility="{Binding Model.firstvisibility}"/> 
<CustomSubMenuItem Title="Second" Visibility="{Binding Model.secondvisibility}"/> 
</MyControl.Items> 
</MyControl> 

но этот вид был погрешность, что мне сделать.

ОБНОВЛЕНИЕ: Спасибо, Я обращаюсь к ниже. Я не определял пространство имен класса в xaml. и верхний код верен, когда я добавляю пространство имен : до CustomSubItemMenu.

+1

ли не Items = "{Binding ItemCollectionName}" работает? –

+0

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

+0

Отметьте свой ответ как правильный, если это был правильный ответ на ваш вопрос. –

ответ

0

Установите контроль DataContext в список, а затем привязать ItemsSource к нему:

List<CustomSubMenuItem> MenuItems = new List<CustomSubMenuItem>(); 
MyControl.DataContext = MenuItems; 

Затем в XAML f.e:

<MyControl ItemsSource="{Binding}"> 
    <MyControl.ItemTemplate> 
     <DataTemplate><TextBlock Text="{Binding Path=Title}"/></DataTemplate> 
    </MyControl.ItemTemplate> 
</MyControl> 

Вы можете связать свой титул и цвет так, как вы хотите.

UPDATE:

Если вы хотите связать Видимость к одному из вашей собственности, один из способов сделать это, чтобы иметь булево значение в модели и привязать его к видимости. Также вам нужен ValueConverter, чтобы установить истинное значение как видимое и false как скрытое.

Сначала добавьте пространство имен в окно. Объявите это пространство имен, в котором указан ваш класс ValueConverter.

xmlns:vm="clr-namespace:NamespaceHere" 

XAML для связывания видимости:

<MyControl Visibility="{Binding VisibilityValue, Converter={StaticResource converter}}"/> 

Затем добавьте ValueConverter к вашему:

<vm:BoolToVisibilityConverter x:Key="converter" /> 

Наконец, необходимо создать класс ValueConverter, использовать мой в качестве примера:

public class BoolToVisibilityConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     bool val = (bool)value; 
     if(val) 
     { 
      return Visibility.Visible; 
     } 
     else 
     { 
      return Visibility.Hidden; 
     } 
    } 

    public object ConvertBack(object value, Type targetType, 
     object parameter, CultureInfo culture) 
    { 
     bool val = (bool)value; 
     if (val) 
     { 
      return Visibility.Visible; 
     } 
     else 
     { 
      return Visibility.Hidden; 
     } 
    } 
} 
+0

спасибо, но я использую шаблон MVVM, и мне нужно привязать, например, видимость каждого элемента в списке к одному свойству в моей модели. например, когда вы делаете menuitem в xaml. вы устанавливаете заголовок для каждого элемента меню и т. д. –

+0

спасибо, но я не хочу устанавливать видимость для моего пользовательского контроля. сообщите мне, как вы устанавливаете видимость в контекстное меню с 5 элементами, чтобы в начале прогона проекта было свернуто 2 элемента. –

+0

Вы хотите, чтобы listitems были элементами списка или в каком контекстном меню вы говорите? –

0

Ваш CustomSubMenuItem должен выводиться из MenuItem или, по крайней мере, из FrameworkElement, если вы хотите создать его в VisualTree, где находится <MyControl.Items>.

В качестве альтернативы, вы можете создать свой пункт-список в качестве StaticResource, а затем привязать к этому ресурсу, как это (настроить пространство имен, конечно), и если вам нужно применить ItemTemplate:

<Window.Resources> 
    <x:Array x:Key="menuItems" Type="{x:Type local:CustomSubMenuItem}" 
      xmlns:local="clr-namespace:yourNamespace"> 
      <local:CustomSubMenuItem Property1="value1" Property2="value2" /> 
      <local:CustomSubMenuItem Property1="value3" /> 
    </x:Array> 
<Window.Resources> 

<MyControl ItemsSource="{StaticResource menuItems}"> 
    <MyControl.ItemTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Property1}" /> 
      </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 
Смежные вопросы