【发布时间】:2016-03-06 17:40:19
【问题描述】:
我已经为此工作了一段时间。似乎仍然无法得到它。我正在尝试将 Setter 属性绑定到从我的数据库填充的 ObservableCollection 中的值。我了解到样式设置器不能在 Xaml 中绑定。我已经阅读并使用了一个很好的例子UWP Binding in Style Setter not working。但我仍然无法让我的 UI 来反映更改。 我在 Item.cs 中的模型:
namespace MyTest
{
class Item
{
public int Id { get; set; }
public string Name { get; set; }
public bool MyIsVisible { get; set; }
public string MyVisibility { get; set; }
}
我的 MainPage.Xaml.CS:
using System.Collections.ObjectModel;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;
namespace MyTest
{
public sealed partial class MainPage : Page
{
ObservableCollection<Item>Items = new ObservableCollection<Item>();
public MainPage()
{
this.InitializeComponent();
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
Items.Add(new Item() { Id = 1, Name = "Item A", MyIsVisible=true, MyVisibility = "Visible" });
Items.Add(new Item() { Id = 2, Name = "Item B", MyIsVisible=false, MyVisibility = "Collapsed" });
Items.Add(new Item() { Id = 3, Name = "Item C", MyIsVisible=true, MyVisibility = "Visible" });
Items.Add(new Item() { Id = 4, Name = "Item D", MyIsVisible=true, MyVisibility = "Visible" });
MyList.ItemsSource = Items;
}
}
}
我的 MainPage.Xaml:
<Page
x:Class="MyTest.MainPage"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:MyTest"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d">
<Page.Resources>
<DataTemplate x:Name="lvDataTemplate" x:DataType="local:Item">
<TextBlock Text="{x:Bind Path=Name}"/>
</DataTemplate>
<Style x:Key="lvItemStyle" TargetType="ListViewItem">
<Setter Property="local:BindingHelper.ListViewItemVisibilityBindingPath" Value="MyVisibility"/>
</Style>
</Page.Resources>
<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
<ListView Grid.Row="1" Name="MyList" Margin="12, 0, 12, 0"
ItemTemplate="{StaticResource lvDataTemplate}"
ItemContainerStyle="{StaticResource lvItemStyle}" />
</Grid>
</Page>
最后是 BindingHelper.cs:
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Data;
namespace MyTest
{
public class BindingHelper
{
public static readonly DependencyProperty ListViewItemVisibilityBindingPathProperty =
DependencyProperty.RegisterAttached(
"ListViewItemVisibilityBindingPath", typeof(string), typeof(BindingHelper),
new PropertyMetadata(null, ListViewItemBindingPathPropertyChanged));
public static string GetListViewItemVisibilityBindingPath(DependencyObject obj)
{
return (string)obj.GetValue(ListViewItemVisibilityBindingPathProperty);
}
public static void SetListViewItemVisibilityBindingPath(DependencyObject obj, string value)
{
obj.SetValue(ListViewItemVisibilityBindingPathProperty, value);
}
private static void ListViewItemBindingPathPropertyChanged(
DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
var propertyPath = e.NewValue as string;
if (propertyPath != null)
{
var gridProperty = ListViewItem.VisibilityProperty;
BindingOperations.SetBinding( obj, gridProperty,
new Binding { Path = new PropertyPath(propertyPath) });
}
}
}
}
我已尝试使用 DB MyVisibilty(字符串)和 MyIsVisible(布尔),但仍然无法折叠项目 B 的可见性。我没有收到任何错误。似乎 BindingHelper.ListViewItemVisibilityBindingPath 仍未获得 DB 值“MyVisiblity”。
有人知道我错过了什么吗?
2016 年 3 月 14 日编辑 - 经过广泛研究。我发现了似乎是什么问题。我将 ListView 更改为 ListBox 并且代码有效! ListView 显然存在一个问题/限制,它不允许使用 Dependency Binding Helper 设置它的 Setter 属性。任何人都可以为此想到解决方案或解决方法吗???
【问题讨论】:
标签: c# xaml listview data-binding win-universal-app