2013-02-10 57 views
0

我有我的项目中以下类,EF5 + ListView和实体

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

用户要保存其参观区使用下面的方法的日期。

enter image description here

我想只得到选定地区从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。不过,我可以得到选定的项目。如果我能得到那些检查过的物品,那对我来说会很高兴。

这是我的ListView

<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> 

XAML我想应该是我的问题的解决方案。

+0

我的WPF是一个小rusty-可以为您提供请为ListView提供XAML代码。 – 2013-02-10 19:41:37

+0

如何绑定ListView中的项目?也许你应该发布你的XAML来跟随你的榜样。尽管如此,我的答案解决了你当前的铸造问题。 – blins 2013-02-10 20:15:31

回答

0

抛出异常是因为ListView的Items属性实际上表示用于生成列表内容的项目列表(即它们不是ListViewItem类型,而是您的区域类型)。这只是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; 
} 
+0

谢谢。您的解决方案奏效但请看我的第二个编辑。你对此有何看法? – 2013-02-11 05:30:30

+0

好的,你问题的第二部分的答案稍微复杂一些。我会稍后尝试编辑我的答案并详细阐述一下。 – blins 2013-02-11 13:50:38

+0

好的。谢谢@blins。我会尝试你的解决方案。 – 2013-02-12 20:43:25