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 です。また、Visit Detailウィンドウが読み込まれると、Areaエンティティ コレクションはListView.ItemsSource. (WPFのため、何もありませんListView.CheckedItems :(

編集2:

ありがとう@blinsあなたのソリューションはうまくいきました。しかし、私はチェックされたアイテムを取得できません。ここに私のxamlを投稿しています。ただし、選択したアイテムを取得できます。それらのチェック項目を取得できれば、それは私にとって喜びです。

これは私の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>

私の問題には解決策があるはずだと思います。

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パターンを詳しく調べる必要がありますが、目的を達成するための 1 つの方法を次に示します。最初に、おそらく次のようなヘルパー メソッドが必要になるでしょう (テストされていません)。

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 に答える