windows [UWP如何在不改变列表视图绑定源的情况下控制列表视图中的UserControl?

3b6akqbq  于 2023-01-14  发布在  Windows
关注(0)|答案(1)|浏览(102)

我在列表视图中放置了一个UserControl。
如何在视图中获取此UserControl的控件。
如果我将其放置在ListView中,则无法在视图中访问它。我也不希望对listView绑定源进行任何更改。
其名称不能直接在视图中访问。
我可以访问事件,但不能访问属性(x:名称、可见性等)。

2ic8powd

2ic8powd1#

可以使用VisualTreeHelper类获取UserControl。
1.通过调用ListView的ContainerFromItemContainerFromIndex获取每个ListViewItem。
1.创建一个递归函数来查找每个ListViewItem中作为UserControl的DependencyObjects
我做了一个简单的来展示它是如何工作的。你可以参考下面的代码。

主页.xaml

<Grid>
    <ListView x:Name="MyListView" Margin="0,0,0,109">
        <ListView.ItemTemplate>
            <DataTemplate x:DataType="x:String">
                <Grid>
                    <local:MyUserControl1></local:MyUserControl1>
                </Grid>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    <Button Content="Button" Margin="682,943,0,0" VerticalAlignment="Top" Click="Button_Click"/>
</Grid>

主页.cs

public List<string> ItemsSourceList { get; set; }
public MainPage()
{
    this.InitializeComponent();
    ItemsSourceList = new List<string>();
    ItemsSourceList.Add("1");
    ItemsSourceList.Add("2");
    ItemsSourceList.Add("3");
    ItemsSourceList.Add("4");
    ItemsSourceList.Add("5");
    MyListView.ItemsSource = ItemsSourceList;
}

private void Button_Click(object sender, RoutedEventArgs e)
{
    foreach (var strItem in ItemsSourceList)
    {
        // get every listview item first
        ListViewItem item = MyListView.ContainerFromItem(strItem) as ListViewItem;
        // the DependencyObject is the UserControl that you want to get                
        DependencyObject myUserControl = FindChild(item);

    }
}

public DependencyObject FindChild(DependencyObject parant)
{
    int count = VisualTreeHelper.GetChildrenCount(parant);

    for (int i = 0; i < count; i++)
    {
        var MyChild = VisualTreeHelper.GetChild(parant, i);
        if (MyChild is MyUserControl1)
        {
            //Here can get the MyUserControl1. 
               
            MyUserControl1 myUserControl = (MyUserControl1)MyChild;
            myUserControl.Foreground = new SolidColorBrush(Colors.Red);

            return myUserControl;
        }
        else
        {
            var res = FindChild(MyChild);
            return res;
        }
    }
    return null;
}

相关问题