我创建了一个用户控件。这种类型具有依赖性
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。但我不能在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 之前添加命名空间时,上面的代码为真。
答案 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>
您可以按照自己的方式绑定标题和颜色。
更新:
如果要将Visibility绑定到您的某个属性,一种方法是在Model中使用bool值并将其绑定到可见性。您还需要ValueConverter将true值设置为visible,将false设置为hidden。
首先,在窗口中添加命名空间。声明定义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;
}
}
}
答案 1 :(得分:0)
如果要在VisualTree中实例化它,CustomSubMenuItem应该从MenuItem派生,或者至少从FrameworkElement派生,这是<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>