1

C# ストア アプリがあり、DataTemplate セレクターを使用して、配列にバインドされた ListView コントロールで使用するテンプレートの種類を決定します。テンプレート化されているため、各 ListView 行に動的な x:Name を割り当てることはできません。

インデックスでリストビューの行にアクセスし、それらの可視性をオンまたはオフに設定できるようにする必要があります。私はこのようなことを試しましたが、.ItemContainerGenerator .ContainerFromItem(item);戻り値nullと毎回 Nullable 例外が発生します:

XAML DataTemplate 内のコントロールにアクセスするにはどうすればよいですか?

いくつかの調査を行った後、上記のソリューションは、SelectedItem に触れているか、設定されている場合にのみ機能するようです。こちらをご覧ください

ItemContainerGenerator が null を返すのはなぜですか?

ページの読み込み時 (初期設定) とボタンのクリック時にメソッドを呼び出して、特定の行の表示を変更できるようにする必要があります。

4

1 に答える 1

2

これはあなたが望むことをするはずです:

var items = grid.ItemsSource as IEnumerable<MyModel>;
foreach (var item in items)
{
    var container = grid.ContainerFromItem(item);
    var button = Children(container)
        .Where(x => x is Button)
        .Select(x => x as Button)
        .Where(x => x.Name.Equals("MyButton"))
        .FirstOrDefault();
    if (button == null)
        continue;
    if (item.ShouldBeVisible)
        button.Visibility = Visibility.Visible;
    else
        button.Visibility = Visibility.Collapsed;
}

これを使用して:

public List<Control> Children(DependencyObject parent)
{
    var list = new List<Control>();
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(parent); i++)
    {
        var child = VisualTreeHelper.GetChild(parent, i);
        if (child is Control)
            list.Add(child as Control);
        list.AddRange(Children(child));
    }
    return list;
}

頑張ってください!

于 2014-05-19T18:48:13.143 に答える