以编程方式更改ListView的SelectedItem属性

时间:2017-07-06 09:58:24

标签: c# xaml uwp

我有2 ListView个,两个都有相同的项目。我想要做的是,当在一个ListView中进行选择时,相同的选择也应该反映在另一个ListView中。两个ListViews绑定到两个不同的ViewModel,但ViewModel都实现了相同的接口。 我已经覆盖了两个ViewModels中的Equals方法。

两个ListView位于不同的XAML页面上。第一个ListViewLV1在Page1.xaml中,LV2在Page2.xaml中。我想要的是,当我在LV2中更改选择时,LV1中的选择也应该更改(仅限单向)。我在x:FieldModifier="public"上设置LV1并通过Page1的静态属性公开,如下所示:

public sealed partial class Page1 : Page
{
    public static Page1 page1 { get; private set; }
}

在第2页,我有这个:

private async void LV2_ItemClick(object sender, ItemClickEventArgs e)
{
    var selected = e.ClickedItem as ISomeCommonInterface; 
    //Comparision is successful --> Contains() always returns corect value; 
    if (Page1.page1.LV1.Items.ToList().Contains(selected))
    {
        Page1.page1.LV1.SelectedItem = null; // this works
        Page1.page1.LV1.SelectedItem = selected; // this doesn't work
    }           
}

我发现在if条件中,赋值为null会将SelectedItem的{​​{1}}更改为null,但下一行不会将其更改为LV1 (它仍然是空的。)

3 个答案:

答案 0 :(得分:0)

分配后添加:

var trackOutboundLink = function(url) {
  ga('send', 'event', 'outbound', 'click', url, {
    'transport': 'beacon',
    'hitCallback': function() {
      document.location = url;
    }
  });
}

答案 1 :(得分:0)

这对我有用:

LV2

SelectedItem中获取JSON的{​​{1}}索引的方法可能更简单,但这足以让您走上正确的轨道。

您可以查看我创建的minimal testing app,其中显示JSON也有效。

答案 2 :(得分:0)

方法1 - SelectionMode="Multiple" - 两个ListViews同步

您应该在两个ListView上订阅SelectionChanged事件 - 只有通过点击才能选择项目 - 并且(当选择更改时)您应该同步选择。

private void SyncSelection(object sender, SelectionChangedEventArgs e)
{
    ListView listViewToAdd = ReferenceEquals(sender, firstListView) ? secondListView : firstListView;

    foreach (var item in e.AddedItems)
    {
        if (!listViewToAdd.SelectedItems.Contains(item))
        {
            listViewToAdd.SelectedItems.Add(item);
        }
    }

    foreach (var item in e.RemovedItems)
    {
        listViewToAdd.SelectedItems.Remove(item);
    }
}

方法2 - SelectionMode="Multiple" - 在另一个

中选择后更新一个

您应该只在可以选择项目的ListView上订阅SelectionChanged事件。

private void SyncSelection(object sender, SelectionChangedEventArgs e)
{
    foreach (var item in e.AddedItems)
    {
        secondListView.SelectedItems.Add(item);
    }

    foreach (var item in e.RemovedItems)
    {
        secondListView.SelectedItems.Remove(item);
    }
}

方法3 - SelectionMode="Single"

如果您想要使SelectionChanged事件同步,或仅在可选择的事件上订阅private void SyncSelection(object sender, SelectionChangedEventArgs e) { ListView senderListView = (ListView)sender; ListView listViewToAdd = ReferenceEquals(sender, firstListView) ? secondListView : firstListView; listViewToAdd.SelectedItem = senderListView.SelectedItem; } 事件,如果您只想根据第一个事件更新第二个事件。

var


您可能需要将def f1(self, filepointer): for _, line in zip(range(100), filepointer): # do stuff with the line def f0(self, filename): with open(filename) as infile: for lineContent in infile: if re.match(lineContent): f1(infile) # only works because of the way file iterators are set up. Otherwise, that for-loop's scoping iterator will bork you here # that continue is unnecessary here else: # do other stuff while parsing lines 替换为您的界面才能使其正常工作。