0

我的项目中有以下课程,

public class Area
{
    [Key]
    public int Id { get; set; }
    [Required]
    public string Name { get; set; }

    public ObservableCollection<VisitDetail> VisitDetails { get; set; }
}

public class VisitDetail
{
    [Key]
    public int VisitId { get; set; }
    [Required]
    public int AreaId { get; set; }

    public Area Area { get; set; }
}

用户希望使用以下方法将其访问区域保存为该日期。

在此处输入图像描述

我只想从中获取选定的区域ListView保存它们。当我试图让那些使用ListView.Items[index].IsSelected它的人抛出一个错误说,

Unable to cast object of type 'Namespace.Area' to type 'System.Windows.Controls.ListViewItem'

请告诉我解决问题的确切方法。

编辑 1:

我的项目在 WPF 中。还要注意这一点,当加载访问详细信息窗口时,Area实体集合绑定到ListView.ItemsSource. (因为 WPF 没有任何ListView.CheckedItems :(

编辑 2:

感谢@blins,您的解决方案有效。但我无法得到检查的项目。我在这里发布我的 xaml。但是我可以得到选定的项目。如果我能拿到那些托运的物品,我会很高兴。

这是我的 XAMLListView

<ListView Name="lvList" SelectionMode="Multiple" ClipToBounds="True" >
    <ListView.View>
        <GridView >
            <GridViewColumn DisplayMemberBinding="{Binding Id}" />
            <GridViewColumn Header="Area" >
                <GridViewColumn.CellTemplate>
                    <DataTemplate >
                        <CheckBox x:Name="checkbox" Content="{Binding Name}" IsChecked="{Binding Path=IsSelected}" />
                    </DataTemplate>
                </GridViewColumn.CellTemplate>
            </GridViewColumn>
        </GridView>
    </ListView.View>
</ListView>

我认为我的问题应该有一个解决方案。

4

1 回答 1

0

抛出异常是因为您的 ListView 的Items属性实际上表示用于生成列表内容的项目列表(即,它们不是 ListViewItem 类型,而是您的 Area 类型)。这正是 WPF 的操作方式,在这种情况下,您需要向底层 ItemsControl 的 ItemContainerGenerator 询问与 UI 中的项目对应的 ListViewItem。

XAML:

<ListView Name="listView1" />

代码(假设你已经设置了ListView的DataContext和ItemsSource等):

ListViewItem item = listView1
   .ItemContainerGenerator
   .ContainerFromIndex(0) as ListViewItem;

item.IsSelected = true;

如果您不知道/关心列表中的索引,而是您知道该项目,则另一种选择。

ListViewItem item = listView1
   .ItemContainerGenerator
   .ContainerFromItem(someAreaInstance) as ListViewItem;

对问题第 2 部分的回答:

您确实应该更深入地研究MVVM模式,这将帮助您从一开始就避免这种情况,但这是实现您所追求的一种方法。首先,您可能需要一个类似以下的辅助方法(未经测试):

static FrameworkElement GetVisualDescendantByName(DependencyObject control, string name)
{
    // Recurse
    FrameworkElement el = null;
    int nChildren = VisualTreeHelper.GetChildrenCount(control);
    for (int i = 0; i < nChildren; i++)
    {
        var child = VisualTreeHelper.GetChild(control, i);
        el = GetVisualDescendantByName(child, name);
        if (el != null)
            return el;
    }

    // See if control is a match
    if (control is FrameworkElement)
    {
        el = control as FrameworkElement;
        if (el.Name == name)
            return control as FrameworkElemdent;
    }

    return null;
}

你可以做类似的事情......

foreach (var item in lvList.Items)
{
    var listItem = lvList.ItemContainerGenerator
        .ContainerFromItem(item) as ListViewItem;

    CheckBox cb = GetVisualDescendantByName(listItem, "checkbox") as CheckBox;

    // Do stuff with CheckBox...
    var myVar = cb.IsChecked;
}
于 2013-02-10T20:05:16.213 回答