XAML 如何通过代码访问DataTemplate中ListViewItem的属性?

o2rvlv0m  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(125)

我有一个xaml文件,其中我有一个ListView(让我们称之为OuterListView),我可以通过名称访问。OuterListView的ItemTemplate使用StaticResource,让我们称之为CustomListViewItem。CustomListViewItem与DataTemplate在同一个文件中定义,它也有一个ListView(让我们称之为InnerListView),它也使用CustomListViewItem作为ItemTemplate。
所以它看起来像这样:

OuterListView (CustomListViewItems as its Items)
     CustomListViewItem (each of the below 3 may have its own ListView (InnerListView) as defined in DataTemplate)
     CustomListViewItem
     CustomListViewItem

我试图实现的事情是通过单击“全选”按钮从InnerListViews中选择所有Items。我单击它,我可以遍历CustomListViewItems,很容易,因为我有OuterListViews的名称,但不幸的是,我不知道如何从CustomListViewItems的InnerListViews中访问元素,以便通过C++代码设置IsSelected属性。
如果你有任何提示如何做到这一点,或者如果你知道肯定是不可能的(不太可能)-请让我知道。
谢谢!

bxfogqkk

bxfogqkk1#

可以使用VisualTreeHelper Class访问CustomListViewItems的InnerListViews中的元素。
首先使用GetParent获取根节点(OuterListView),然后从根节点开始查找子控件,可以根据控件类型或x:name进行搜索。

private void InnerListViewSelectAllItem_Click(object sender, RoutedEventArgs e)
{
    var customListView = VisualTreeHelper.GetParent(this);
    var outerListView  = VisualTreeHelper.GetParent(customListView);

    List<InnerListViews> results= null;
    FindChildren(results, outerListView);

    for (int i = 0; i < results.Count; i++)
    {
        results[i].SelectAll();
    }
}
       
internal static void FindChildren<T>(List<T> results, DependencyObject startNode)
where T : DependencyObject
{
    int count = VisualTreeHelper.GetChildrenCount(startNode);
    for (int i = 0; i < count; i++)
    {
        DependencyObject current = VisualTreeHelper.GetChild(startNode, i);
        if ((current.GetType()).Equals(typeof(T)) || (current.GetType().GetTypeInfo().IsSubclassOf(typeof(T))))
        {
            T asType = (T)current;
            results.Add(asType);
        }
        FindChildren<T>(results, current);
    }
}
public static DependencyObject MyFindChildByName(DependencyObject parant, string ControlName)
{
    int count = VisualTreeHelper.GetChildrenCount(parant);

    for (int i = 0; i < count; i++)
    {
        var MyChild = VisualTreeHelper.GetChild(parant, i);
        if (MyChild is FrameworkElement && ((FrameworkElement)MyChild).Name == ControlName)
            return MyChild;

        var FindResult = MyFindChildByName(MyChild, ControlName);
        if (FindResult != null)
            return FindResult;
    }

    return null;
}

C++代码示例:https://github.com/microsoft/Windows-universal-samples/blob/main/Samples/Logging/cpp/Scenario2.xaml.cpp#L34

相关问题