这是我尝试创建具有依赖项属性的用户控件的第一步。因此,请原谅我缺乏关于该主题的知识。我在其中一个页面上创建了一个常规设计,希望将其带给可重用的用户控件。
页面上的原始控制
所以这是我要移植到可重复使用的UserControl中的控件
<ToggleButton x:Name="filterButton" Background="{StaticResource BackgroundLightBrush}" BorderThickness="0">
<fa:ImageAwesome x:Name="border"
Height="15"
Foreground="{StaticResource MediumBlueBrush}"
Icon="Filter"/>
</ToggleButton>
<Popup x:Name="popup"
AllowsTransparency="True"
StaysOpen="False"
PlacementTarget="{Binding ElementName=filterButton}"
IsOpen="{Binding ElementName=filterButton,Path=IsChecked,Mode=TwoWay}">
<Border BorderThickness="2" BorderBrush="{StaticResource MediumBlueBrush}" Background="{StaticResource BackgroundLightBrush}" CornerRadius="5">
<ItemsControl ItemsSource="{Binding HeaderList}"
Background="{StaticResource BackgroundLightBrush}"
Margin="1">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="5">
<CheckBox IsChecked="{Binding IsChecked}"/>
<TextBlock Text="{Binding HeaderName}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
</Popup>
以下是此控件的外观
这是我的依赖项财产代码
在这里您可以看到我创建了一个类型为RulesColumnHeader的ObservableCollection。这是我试图将UserControl设置为的项目来源。
public partial class FilterDropDown : UserControl
{
public ObservableCollection<RulesColumnHeader> ItemSource
{
get => (ObservableCollection<RulesColumnHeader>)GetValue(ItemSourceProperty);
set => SetValue(ItemSourceProperty, value);
}
// Using a DependencyProperty as the backing store for MyProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty ItemSourceProperty =
DependencyProperty.Register("ItemSource", typeof(ObservableCollection<RulesColumnHeader>), typeof(FilterDropDown), new FrameworkPropertyMetadata(null));
public FilterDropDown()
{
InitializeComponent();
}
}
UserControl
这是我在创建用户控件并将项目源绑定到我创建的依赖项属性时的“尝试”。
<UserControl x:Class="YAI.BomConfigurator.Desktop.Control.FilterDropDown"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:YAI.BomConfigurator.Desktop.Control"
xmlns:fa="http://schemas.fontawesome.io/icons/"
mc:Ignorable="d"
d:DesignHeight="50" d:DesignWidth="50">
<Grid>
<ToggleButton x:Name="filterButton" Background="Transparent" BorderThickness="0">
<fa:ImageAwesome x:Name="border"
Height="15"
Foreground="{StaticResource MediumBlueBrush}"
Icon="Filter"/>
</ToggleButton>
<Popup x:Name="popup"
AllowsTransparency="True"
StaysOpen="False"
PlacementTarget="{Binding ElementName=filterButton}"
IsOpen="{Binding ElementName=filterButton,Path=IsChecked,Mode=TwoWay}">
<Border BorderThickness="2" BorderBrush="{StaticResource MediumBlueBrush}" Background="{StaticResource BackgroundLightBrush}" CornerRadius="5">
<ItemsControl ItemsSource="{Binding ItemSource, Source={local:FilterDropDown}}"
Background="{StaticResource BackgroundLightBrush}"
Margin="1">
<ItemsControl.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" Margin="5">
<CheckBox IsChecked="{Binding IsChecked}"/>
<TextBlock Text="{Binding HeaderName}"/>
</StackPanel>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Border>
</Popup>
</Grid>
在我对ItemsControl进行绑定的ItemSource上,source =部分引发错误,提示“无效的标记扩展,预期类型为'对象',实际为FilterDropDown”。
所以这基本上就是我现在的位置。我不确定该如何前进或该怎么做。我试图弄清楚如何将UserControl项目源绑定到依赖项属性。我不知道这是我的语法还是我在错误地进行整个操作。如果有人可以帮助指导我,那就太好了。
谢谢
答案 0 :(得分:1)
设置ItemsSource绑定的Source
属性是错误的。
替换
ItemsSource="{Binding ItemSource, Source={local:FilterDropDown}}"
使用
ItemsSource="{Binding ItemSource,
RelativeSource={RelativeSource AncestorType=UserControl}}"
此外,将ItemsSource声明为ObservableCollection甚至是不必要的甚至是错误的。使用更通用的类型,例如IEnumerable
:
public IEnumerable ItemSource
{
get => (IEnumerable)GetValue(ItemSourceProperty);
set => SetValue(ItemSourceProperty, value);
}
public static readonly DependencyProperty ItemSourceProperty =
DependencyProperty.Register(
nameof(ItemSource), typeof(IEnumerable), typeof(FilterDropDown));
答案 1 :(得分:0)
在构建自定义控件时,您希望将ItemsSource定义为:
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register(nameof(ItemsSource), typeof(IEnumerable),
typeof(xxx), new FrameworkPropertyMetadata(null, new PropertyChangedCallback(OnItemsSourceChanged)));
public IEnumerable ItemsSource
{
get
{
return (IEnumerable)GetValue(ItemsSourceProperty);
}
set
{
SetValue(ItemsSourceProperty, value);
}
}
OnItemsSourceChanged不是必需的,我只是将其包含在我编写的代码中。
您还将希望您的控件派生自Control。不是用户控件。因此,.cs和.xaml的嵌套方式不同。它们是完全分开的。 .cs是独立的,而xaml位于主题文件夹中。
public class xxx : Control
并有一个静态构造函数:
static xxx()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(xxx), new FrameworkPropertyMetadata(typeof(xxx)));
}
然后在XAML中,定义一个以xxx为目标的样式,并以该样式设置ControlTemplate。
通常,您将在其中使用TemplateBinding绑定来绑定属性。