如何在 XAML 中设置用户控件的列表项

本文关键字:控件 列表 用户 设置 XAML | 更新日期: 2023-09-27 17:56:20

我创建一个用户控件。 这具有这种类型的依赖关系

List<CustomSubMenuItem>

和自定义子MeuItem

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

在 XAML 中,我绑定到 Commonl 中的 prperty。 但我不能在 XAML 中制作此项,例如上下文菜单或列表框项。

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

但是这种有错误,我该怎么办。

更新:谢谢我在下面回答。我没有在 XAML 中定义类的命名空间。当我添加命名空间时,上面的代码是正确的自定义子项菜单之前。

如何在 XAML 中设置用户控件的列表项

将控件数据上下文设置为列表,然后将 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>

您可以按照自己的方式绑定标题和颜色。

更新:

如果要将可见性绑定到

您的某个属性,一种方法是在模型中具有布尔值并将其绑定到可见性。此外,您还需要一个 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;
        }
    }
}

你的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>