如何在XAML中设置usercontrol的列表项目

问题描述:

我创建了一个用户控件。这通过这种类型如何在XAML中设置usercontrol的列表项目

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具有dependencypoperty。但我不能使这个项目在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。在XAML f.e

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

然后:

+1

没有项目= “{Binding ItemCollectionName}”工作? –

+0

是的,它是作品。但我需要在运行时更改一些项目,并需要绑定到内部属性。如可见性。 –

+0

如果您的问题是正确答案,请将我的答案标记为正确。 –

设置控件的DataContext给你的清单,然后将其绑定的ItemsSource它

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

您可以绑定您的标题和颜色你想要的方式。

UPDATE:

如果你要绑定能见度你的财产之一,一个办法做到这一点是有型号bool值,并将其绑定到可视性。你也需要一个ValueConverter来将真值设置为可见和假隐藏。

首先,在窗口中添加一个名称空间。在您的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模式,我需要将例如列表中每个项目的可见性绑定到我的模型中的一个属性。就像你在xaml中制作menuitem一样。您为每个菜单项设置标题等。 –

+0

谢谢,但我不想为我的用户控件设置可见性。请告诉我如何设置5个项目的上下文菜单的可见性,在项目运行开始时应该折叠2个项目。 –

+0

你想要列表项目是List Items还是你在谈论什么contextmenu? –

如果你想在你的VisualTree中实例化你的CustomSubMenuItem,它应该从MenuItem派生,或者至少从FrameworkElement派生,这是<MyControl.Items>的地方。

或者,您可以创建项目列表作为静态资源,然后绑定到这个资源,像这样的(当然调整的命名空间),如果你需要申请一个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>