【问题标题】:Change a ListView Setting Property in XAML from Database UWP从数据库 UWP 更改 XAML 中的 ListView 设置属性
【发布时间】: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


    【解决方案1】:

    MyVisibility属性的类型从string更改为Visibility

    class Item
    {
        ...
        public Visibility MyVisibility { get; set; }
    }
    

    【讨论】:

    • 嗨,我以前尝试过类似的方法。我刚才又试了一次。我在我的 Item 类中添加了 Visibility VisObject。我在所有 Items.Add 构造函数中设置了值,并设置为 Windows.UI.Xaml.Visibility.Visible 或 Windows.UI.Xaml.Visibility.Collapsed。将 Setter 更改为 。还是不行!
    猜你喜欢
    • 2020-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2017-08-12
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多