繁体   English   中英

多个ToggleSwitch实例在UWP中使用C#从列表(ListView)获取相同的数据

[英]Multiple ToggleSwitch instances get same data from the List (ListView) using C# in UWP

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

我有一个带有多个TextBlocks和每个数据行一个ToggleSwitch的ListView。

然后,我用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)。 其他ToggleSwitches均不起作用。 使用上面的代码时,它们不返回任何数据。

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

基本数据绑定: https : //docs.microsoft.com/zh-cn/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 ,请参阅我提供的链接,它们将为您提供很多帮助:)

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

不通知

为了获得有关属性更改的通知并使两种方式的数据绑定正常工作,您需要从以下类继承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存储库上,并共享您问题中的链接,以便人们可以对其进行详细了解。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM