ItemsControl的UWP绑定方向
我想创建一个模板控件,它派生自ItemsControl的UWP绑定方向,uwp,Uwp,我想创建一个模板控件,它派生自ItemsControl,如果需要,可以更改它的方向 所以,我试过这个: <Setter Property="ItemsPanel"> <Setter.Value> <ItemsPanelTemplate> <ItemsStackPanel Orientation="{Binding Orientation, RelativeSource={RelativeSource Mod
ItemsControl
,如果需要,可以更改它的方向
所以,我试过这个:
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="{Binding Orientation, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
它不起作用,然后我尝试了Mode=Self
,没有成功
Orientation
是一个dependencProperty
,我已经在.cs文件中声明了它
我遇到了一个wpf的旧解决方案,它使用了UWP中不可用的AncestorType
我怎样才能解决这个问题
谢谢 这在UWP中是不支持的。见:
Windows演示基础(WPF)和微软Silverlight支持使用绑定表达式为样式中的SETER提供值的能力。Windows运行时不支持Setter.Value的绑定用法(绑定将不会计算,Setter无效,不会出现错误,但也不会得到所需的结果)。当您从Windows演示基础(WPF)或微软Silverlight XAML转换XAML样式时,用绑定字符串或设置值的对象替换任何绑定表达式用法,或将这些值重构为共享{STATEATIORATURSOR}标记扩展值而不是绑定值。 但您可以使用attache属性来执行此操作
在主页面中添加方向属性 public static readonly DependencyProperty OrientationProperty = DependencyProperty.Register(
"Orientation", typeof(Orientation), typeof(MainPage), new PropertyMetadata(default(Orientation)));
public Orientation Orientation
{
get { return (Orientation) GetValue(OrientationProperty); }
set { SetValue(OrientationProperty, value); }
}
添加BindingHelper并定义attache属性
public static readonly DependencyProperty ItemsPanelOrientationProperty = DependencyProperty.RegisterAttached(
"ItemsPanelOrientation", typeof(bool), typeof(BindingHelper),
new PropertyMetadata(default(bool), ItemsPanelOrientation_OnPropertyChanged));
在属性更改的ItemsPanelOrientation\u中
设置绑定到ItemsStackPanel.Orientation
private static async void ItemsPanelOrientation_OnPropertyChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (d is ListView listView)
{
await listView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
if (listView.ItemsPanelRoot is ItemsStackPanel stackPanel)
{
BindingOperations.SetBinding(stackPanel, ItemsStackPanel.OrientationProperty, new Binding()
{
Path = new PropertyPath("Orientation"),
Mode = BindingMode.OneWay
});
}
});
}
}
public MainPage()
{
this.InitializeComponent();
Task.Run(async () =>
{
while (true)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() => { Orientation = Orientation.Horizontal; });
await Task.Delay(TimeSpan.FromSeconds(5));
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() => { Orientation = Orientation.Vertical; });
await Task.Delay(TimeSpan.FromSeconds(5));
}
});
}
在xaml中,编写BindingHelper.ItemsPaneLocation和ItemsPaneTemplate
<ListView.Style>
<Style TargetType="ListView">
<Setter Property="ItemsPanel">
<Setter.Value>
<ItemsPanelTemplate>
<ItemsStackPanel Orientation="{Binding Orientation, RelativeSource={RelativeSource Mode=TemplatedParent}}"/>
</ItemsPanelTemplate>
</Setter.Value>
</Setter>
<Setter Property="local:BindingHelper.ItemsPanelOrientation" Value="True"></Setter>
</Style>
</ListView.Style>
在主页中编写代码以更改方向
private static async void ItemsPanelOrientation_OnPropertyChanged(DependencyObject d,
DependencyPropertyChangedEventArgs e)
{
if (d is ListView listView)
{
await listView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
if (listView.ItemsPanelRoot is ItemsStackPanel stackPanel)
{
BindingOperations.SetBinding(stackPanel, ItemsStackPanel.OrientationProperty, new Binding()
{
Path = new PropertyPath("Orientation"),
Mode = BindingMode.OneWay
});
}
});
}
}
public MainPage()
{
this.InitializeComponent();
Task.Run(async () =>
{
while (true)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() => { Orientation = Orientation.Horizontal; });
await Task.Delay(TimeSpan.FromSeconds(5));
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal,
() => { Orientation = Orientation.Vertical; });
await Task.Delay(TimeSpan.FromSeconds(5));
}
});
}
github中的所有代码: