0

这是我第一次使用 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 均不起作用。使用上面的代码时,它们不会返回任何数据。

4

1 回答 1

0

请使用DataTemplate填充列表视图,并在您的数据模板中放置一个切换开关,并x:将切换开关的IsOn值与项目类中的bool属性绑定。并在您的 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,请参阅我为您提供的链接,它们会对您有很大帮助:)

而不是循环列表并将发件人作为 ToggleSwitch获取,这显然每次都会给你相同的实例。您应该只遍历绑定到 ListView 的列表,然后检查您的item.IsOn属性并获取您的 item.ProductId 并使用您的项目对象做任何您想做的事情。请注意,此项目来自您绑定到 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 存储库上放置一个解决此问题的简单应用程序,并在您的问题中分享链接,以便人们可以详细查看它。

于 2018-04-04T12:22:21.907 回答