Несколько экземпляров ToggleSwitch получают одни и те же данные из списка (ListView) с помощью C# в UWP.

Это мой первый опыт работы с ToggleSwitch. Чего я пытаюсь добиться, так это показать разные данные из списка с помощью разных переключателей ToggleSwitches.

У меня есть ListView с несколькими TextBlocks и одним ToggleSwitch для каждой строки данных.

Затем я заполняю ListView данными из List. (Список заполняется с использованием класса, который предусматривает

общественный переключатель ToggleSwitch {получить; набор;}

Вот как я пытаюсь получить данные 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;
                }
            }
        }



    }

К сожалению, я получаю один и тот же (последний добавленный) productId от всех ToggleSwitches, как если бы они указывали на одно и то же место.

РЕДАКТИРОВАТЬ> Я переписал код, как предложил 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, тот, что соответствует последней добавленной записи (я дергал ProductId из JointList). Другие переключатели ToggleSwitch не работают. Они не возвращают никаких данных при использовании приведенного выше кода.


person positive perspective    schedule 04.04.2018    source источник


Ответы (1)


Используйте шаблон данных для заполнения списка и в вашем шаблоне данных поместите тумблер и x:Bind значение IsOn для вашего переключателя со свойством bool в вашем класс предмета. и чтобы получить правильные значения в вашем объекте С# за установкой двухсторонней привязки данных.

базовая привязка данных: 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

вы можете выполнить привязку с помощью Binding или x:Bind, однако лучший способ привязки в uwp — x:Bind, см. ссылки, которые я вам предоставил. вам очень поможет :)

Вместо того, чтобы зацикливать список и получать sender как ToggleSwitch, который, очевидно, каждый раз будет давать один и тот же экземпляр. вы должны просто перебрать список, который вы привязываете к ListView, а затем проверить свое свойство item.IsOn и получить ur item.ProductId и делать то, что вы хотите, с вашим объектом item. обратите внимание, что этот элемент взят из списка элементов, которые вы привязываете к ListView. когда вы устанавливаете двухстороннюю привязку данных с помощью переключателя, ваше свойство item.IsOn будет автоматически изменяться при изменении переключателя toggleswitch.IsOn, поэтому вам не нужно получать какой-либо экземпляр переключателя в вашем коде.

INNotify

чтобы получать уведомления об изменении свойств и для правильной работы двухсторонней привязки данных, вам необходимо наследовать свой класс продукта от следующего класса

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 и поделиться ссылкой в ​​своем вопросе, чтобы люди могли подробно изучить ее.

person Muhammad Touseef    schedule 04.04.2018