【问题标题】:UWP 10 (xaml) - MVVM - Listbox with Nested Observable CollectionUWP 10 (xaml) - MVVM - 具有嵌套可观察集合的列表框
【发布时间】:2017-11-19 23:19:43
【问题描述】:

所以第一次。另外,我不是程序员,更像是脚本编写者/设计师。

无论如何。我有一个使用可观察集合作为其 itemsSource 的列表框。添加新条目并保存它们不是问题,所有这些都有效。进行更改(通过 INotifyChanged 等)一切正常。

XAML:

 <ListBox x:Name="ProjectsListedView"
                 ItemsSource="{Binding Companies.ProjectsListed}"
                 SelectedValue="{Binding ProjectsName}"
                 SelectedIndex="-1"
                 SelectionMode="Extended">
 </Listbox>

这部分有效。 (除了选定的值/索引)

ProjectsListed 是一个可观察的集合,属于公司的一部分。 所以这个想法是。当我选择一家公司时.. 该公司列出的项目出现。这按预期工作。

但是..对于我的生活,我无法让“选定的项目”正常工作。

我的尝试:

<Setter Property="IsSelected" Value="{Binding IsSelected}"/>

甚至:

<Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"/>

两者都没有工作。无论如何。奇怪的是.. 正在进行选择。 创建列表框并添加集合时(来自 xml 文件)。我可以选择一个项目..并将所选项目中的信息获取到文本框中。示例:

<TextBox Text="{Binding SelectedItem.ProjectName, Mode=TwoWay, ElementName=ProjectsListedView}"
                 Style="{StaticResource TB_M}"
                 Width="450" 
                 Name="ProjectNameInput" 
                 PlaceholderText=""
                 Grid.Row="0"/>

那么问题是什么: 无法删除“选定项目”。 `

public async static Task DeleteProjectFile(this Company companies)
    {
        var file = await GetCompanyFile(companies.CompanyName);
        if (file == null)
        {
            var folder = await GlobalFolder();
            file = await folder.CreateFileAsync(companies.CompanyName + GlobalFileExtension, CreationCollisionOption.ReplaceExisting);
        }
        Projects project = new Projects();

        companies.ProjectsListed.Remove(project);
    }

谁能指出我正确的方向(示例将不胜感激)。如果需要更多代码,请询问。如前所述,这是我的第一个问题/帖子。

亲切的问候。

【问题讨论】:

  • 这条线应该做什么? companies.ProjectsListed.Remove(project); 乍一看,project 是一个新创建的对象,并且不存在于 observablecollection 中,所以这一行只会抛出异常。
  • 据说它应该从列表/xmlfile中删除项目。奇怪的是,有一段时间它起作用了(在我进入列表框之前)。因此,我从未回头看它。 Companies =“父级”,ProjectsListed = observablecollection & remove = 用于从数组/集合中删除项目的命令。此外,当我按下按钮时,我不会抛出任何异常。它也不会崩溃或发生任何事情。 ..所以..
  • 那么根据@kennyzx 的评论,您是否更新并解决了您的问题?如果仍有问题,您是否有 minimal reproducible example 供我们测试?
  • 修复了这个问题,或者至少修复了这个问题。评论并没有太大帮助,请朋友看看。随意关闭这个(soz,我似乎无法找出在哪里/如何做到这一点)。
  • @SdNA,您可以分享您的解决方案作为答案并标记它。或者自己删除这个话题。见meta.stackexchange.com/questions/42265/…

标签: c# mvvm listbox uwp observablecollection


【解决方案1】:

我已经设法解决了大部分问题。

删除部分感谢朋友的帮助和一点点来自kennyzx的评论

public async static Task DeleteProjectFile(this Company companies)
    {
        var file = await GetCompanyFile(companies.CompanyName);
        if (file == null)
        {
            var folder = await GlobalFolder();
            file = await folder.CreateFileAsync(companies.CompanyName + GlobalFileExtension, CreationCollisionOption.ReplaceExisting);
        }

            companies.ProjectsListed.RemoveAt(0);
    }

它可能不会删除选定的条目,但至少它正在删除一个条目。

还有一个用于存储“选定项目”的修复方法,可能有点奇怪,但我只是在

上创建了一个额外的 xml 序列化
public async void ProjectsListedView_SelectionChanged(object sender, SelectionChangedEventArgs e)

在不同的位置。每次调用“框架”时,它都会重新加载它。 然而,实际选择的设置器(突出显示)不起作用,但总而言之,它是固定的。

感谢所有试图提供帮助的人。

【讨论】:

    【解决方案2】:

    我认为问题出在:SelectionMode="Extended"

    如果你看看here(如果锚不起作用,搜索SelectionMode),你可以找到这一行:

    当 SelectionMode 为 Multiple 或 Extended 时,使用 SelectedItems 属性获取被选中的项目。

    如果您不需要多选,请将SelectionMode 更改为Single。否则,您需要使用SelectedItems 属性而不是SelectedItem

    【讨论】:

    • 首先,感谢您的回复。可悲的是,这不起作用。感觉就像 uwp 在“伪造”选择。就像它显示的那样,它显示了可观察集合中的信息,仅此而已。我的公司列表框(基于 MRU)工作正常。但这不是可观察的集合,也不是嵌套的。
    猜你喜欢
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-16
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多