【问题标题】:Multiple ToggleSwitch instances get same data from the List (ListView) using C# in UWP多个 ToggleSwitch 实例在 UWP 中使用 C# 从列表 (ListView) 中获取相同的数据
【发布时间】:2018-09-13 23:18:33
【问题描述】:

这是我第一次使用 ToggleSwitch。我想要实现的是使用不同的切换开关从列表中显示不同的数据。

我有一个 ListView,其中包含多个 TextBlocks,每行数据都有一个 ToggleSwitch。

然后我用 List 中的数据填充 ListView。 (使用预见的类填充列表

公共 ToggleSwitch 开关 {get;设置;}

这是我尝试从每一行获取 ToggleSwitch 数据的方法:

private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e)
    {

        for (int a = 0; a < jointList.Count; a++)
        {
               jointList[a].Switch = sender as ToggleSwitch;
            if (jointList[a].Switch != null)
            {
                if (jointList[a].Switch.IsOn == true)
                {
                    ToggleTest.Text = jointList[a].ProductId.ToString();

                    ToggleTest.Visibility = Visibility.Visible;


                }
                else
                {

                    ToggleTest.Visibility = Visibility.Collapsed;
                }
            }
        }



    }

不幸的是,我从所有 ToggleSwitches 中获得了相同的(最后添加的)productId,就好像它们指向同一个地方一样。

编辑> 我已经按照 touseef 的建议重写了代码:

private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e)
    {

        for (int i = 0; i < jointList.Count; i++)
        {


                if (jointList[i].Value == true)
                {
                    ToggleTest.Text = jointList[i].ProductId.ToString();

                   // ToggleTest.Text = jointList[a].ProductId.ToString();
                    ToggleTest.Visibility = Visibility.Visible;


                }
                else
                {

                    ToggleTest.Visibility = Visibility.Collapsed;
                }

        }



    }

但是现在什么都没有显示出来。

编辑: 这是解决问题的另一种尝试:

private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e)
    {

        foreach (var record in jointList)
        {

            if (record.Value == true)
            {
                ToggleTest.Text = record.ProductId.ToString();


                ToggleTest.Visibility = Visibility.Visible;


            }
            else
                {

                    ToggleTest.Visibility = Visibility.Collapsed;
                }

        }



    }

现在只有一个 ToggleSwitch 有效,对应于最后添加的记录(我正在拉出jointList 的 ProductId)。 其他 ToggleSwitch 均不起作用。使用上面的代码时,它们不会返回任何数据。

【问题讨论】:

    标签: c# listview uwp toggle toggleswitch


    【解决方案1】:

    请使用DataTemplate 填充列表视图,并在您的数据模板中放置一个切换开关,并 x:Bind 使用 bool 为您的切换开关设置 IsOn 项目类别中的属性。并在您的 c# 对象中获取正确的值,设置两种方式数据绑定。

    基本数据绑定:https://docs.microsoft.com/en-us/windows/uwp/data-binding/data-binding-quickstart

    深度绑定:https://docs.microsoft.com/en-us/windows/uwp/data-binding/data-binding-in-depth

    您可以使用 Bindingx:Bind 进行绑定,但在 uwp 中绑定的更好方法是 x:Bind,请参阅我的链接只要你他们会帮助你很多:)

    而不是循环列表并获取 sender as ToggleSwitch 这显然每次都会给你相同的实例。您应该只遍历绑定到 ListView 的列表,然后检查您的 item.IsOn 属性并获取您的 item.ProductId 并使用您的项目对象做任何您想做的事情。请注意,此项目来自您绑定到 ListView 的项目列表。当您使用 toggleswitch 设置双向数据绑定时,您的 item.IsOn 属性将在 toggleswitch.IsOn 更改时自动更改,因此您不需要在您的代码中获取任何 toggleswitch 实例。

    INotify

    为了获得有关属性更改的通知并让两种方式的数据绑定正常工作,您需要从以下类继承您的 Product 类

    public class Observable : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
    
        protected void Set<T>(ref T storage, T value, [CallerMemberName]string propertyName = null)
        {
            if (Equals(storage, value))
            {
                return;
            }
    
            storage = value;
            OnPropertyChanged(propertyName);
        }
    
        protected void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
    

    然后在您的 IsOn 属性设置器方法中,像这样调用 onpropertychanged 事件。

     public class Product : Observable
    {
        public int ProductId { get; set; }
        private bool isOn;
    
        public bool IsOn
        {
            get { return isOn; }
            set { isOn = value; Set(ref isOn, value, nameof(IsOn)); }
        }
    
    }
    

    切换事件

    private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e)
    {
        //assuming productList is a List<Product> which was set as ListView.ItemSource
        foreach (var product in productList)
        {
    
            if (product.IsOn == true)
            {
                ToggleTest.Text = product.ProductId.ToString();
                ToggleTest.Visibility = Visibility.Visible;
            }
            else
            {
                ToggleTest.Visibility = Visibility.Collapsed;
            }
    
        }
    }
    

    如果您的问题仍未解决,我会建议您在 GitHub 存储库上放置一个解决此问题的简单应用程序,并分享您问题中的链接,以便人们可以详细查看。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-06-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-10
      • 1970-01-01
      • 1970-01-01
      • 2018-05-24
      相关资源
      最近更新 更多