![](/img/trans.png)
[英]UWP C# Toggleswitch inside Listview - How to get items of Row when clicked on Toggleswitch
[英]How to get access to ToggleSwitch instance within ListView in C# UWP?
我在这里打开了问题,但我们无法解决我的问题。 当我们做出一些假设时,我决定创建一个新问题,而前一个问题并不涉及真正的问题(我们认为这是绑定问题,但您会读到的不是)。
简而言之,我有一个ListView,其中包含来自列表的数据,称为jointList。 该列表运行良好,并且具有所有必需的数据。 (我检查了)
在ListView的每一行上,我都放置了一个ToggleSwitch(在xaml中),然后尝试对每个开关进行操作。
每个开关应对应于同一行中的数据。
我创建了Toggled事件,该事件应适用于所有如下所示的toggleSwitches:
private void ToggleSwitch_Toggled(object sender, RoutedEventArgs e)
{
foreach (var product in jointList)
{
if (product.IsOn == true)
{
ToggleTest.Text = product.ProductId.ToString(); // this is for testing only, later I would do something with the data retrieved
ToggleTest.Visibility = Visibility.Visible;
}
else
{
ToggleTest.Visibility = Visibility.Collapsed;
}
}
}
但这只能使一个toggleSwitch起作用。 这是与列表中最后添加的产品相对应的开关(我猜它是在指向最后一个ID)。 其他开关什么也不返回,就好像该方法没有正确地遍历列表一样,或者好像只有一个开关挂了一样。
因此,是否有可能通过我尝试执行的一个Toggled事件来启动并运行所有开关?
这是显示一种方法的示例。
在此示例中,我们具有以下产品视图模型:
public class Product : INotifyPropertyChanged
{
private string _name;
public string Name
{
get => _name;
set
{
if (value == _name) return;
_name = value;
OnPropertyChanged();
}
}
因此,只有一个名称属性。
然后,我们在MainPage中创建了一个产品集合:
private void FrameworkElement_OnLoaded(object sender, RoutedEventArgs e)
{
var items = new ObservableCollection<Product>();
for (int i = 0; i < 9; i++)
{
items.Add(new Product($"item {i}"));
}
this.Items.ItemsSource = items;
}
以及创建视图的XAML:
<ListView Loaded="FrameworkElement_OnLoaded" x:Name="Items">
<ListView.ItemTemplate>
<DataTemplate>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock x:Name="RowContent" Text="{Binding Name}"/>
<ToggleSwitch x:Name="Toggle" Grid.Column="1" Toggled="Toggle_OnToggled"/>
</Grid>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
结果:
现在,我们想在用户切换开关时更改文本。 这是在Toggle_OnToggled事件处理程序中完成的:
private void Toggle_OnToggled(object sender, RoutedEventArgs e)
{
var toggle = (ToggleSwitch) sender;
var dataContext = ((Grid)toggle.Parent).DataContext;
var dataItem = (Product) dataContext;
dataItem.Name = $"Toggled {toggle.IsOn}";
}
因此,经过几次切换后:
Mikael Koskinen已回答了我的问题。
除了最后一点是OnToggled事件处理程序之外,我的大多数代码都是正确的,并且与他的解决方案相同。 这是正常工作的正确处理程序:
private void Toggle_OnToggled(object sender, RoutedEventArgs e)
{
var toggle = (ToggleSwitch)sender;
var dataContext = ((Grid)toggle.Parent).DataContext;
var dataItem = (ScheduleList)dataContext;
ToggleTest.Text = dataItem.ProductId;
}
我以前的处理程序版本不包含重要的位,即dataContext和dataItem。
现在它就像一种魅力。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.