0

我在这里提出了问题,但我们无法解决我的问题。当我们做出一些假设时,我决定创建新问题,而前一个问题并不涉及真正的问题(我们认为这是绑定的问题,但正如您将读到的那样,它不是)。

简而言之,我有一个 ListView,其中包含来自名为jointList 的列表中的数据。该列表运行良好,并且包含所有必要的数据。(我检查过了)

在 ListView 的每一行上,我都放置了一个 ToggleSwitch(在 xaml 中),然后我尝试对每个开关做一些事情。

每个开关应对应于同一行的数据。

我创建了应该适用于所有 toggleSwitches 的 Toggled 事件,如下所示:

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 事件来启动并运行所有开关?

4

2 回答 2

1

这是一个显示一种方式的示例。

在此示例中,我们有以下产品视图模型:

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-event 处理程序中完成的:

    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}";
    }

所以在几次切换之后:

切换

于 2018-04-05T05:03:47.103 回答
0

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。

它现在就像一个魅力。

于 2018-04-05T10:48:09.533 回答