[英]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
您可以使用Binding或x: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.