FindVisualChildren可以找到ListView的GridViewColumns吗?如果没有,如何解决这些问



FindVisualChildren可以定位ListView的GridViewColumns吗?在我的代码后面下面,单击按钮(在listview完全显示之后,列全部填充等)总是返回0。xml代码并不有趣,所以我没有包括。只是一个listview与gridview作为视图。

FindLogicalChildren似乎没有做得更好。我对此的解读是不确定的。似乎有些争论。

这里的最终目的是在用户单击按钮时扩展列的宽度。MVVM在这方面的各种尝试都以失败告终。代码隐藏的方法应该可以工作,但是不能直接处理命名的GridViewColumns,因此使用visualchildren方法。我怎么把它们挖出来?
private void Button_Click(object sender, RoutedEventArgs e)
{
var thechildren = FindVisualChildren<GridViewColumn>(SectionListView);
MessageBox.Show(thechildren.Count().ToString());
}
public static IEnumerable<T> FindVisualChildren<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj != null)
{
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
DependencyObject child = VisualTreeHelper.GetChild(depObj, i);
if (child != null && child is T)
{
yield return (T)child;
}
foreach (T childOfChild in FindVisualChildren<T>(child))
{
yield return childOfChild;
}
}
}
}

我不认为VisualTreeHelperLogicalTreeHelper有任何可能得到当前的GridViewColumnxaml代码并不有趣,所以我没有包含- xaml代码非常有趣,因为您可以在xaml中解决它。您只需要将当前GridViewColumn的引用传递给事件处理程序。你可以通过Button.Tagproperty:

<ListView.View>
<GridView>
<GridView.Columns>
<GridViewColumn x:Name="col1">
<GridViewColumn.CellTemplate>
<DataTemplate>
<Button Content="gridViewButton" Click="Button_Click" Tag="{Binding ElementName=col1}" />
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView.Columns>
</GridView>
</ListView.View>
private async void Button_Click(object sender, RoutedEventArgs e)
{
if((sender as Button)?.Tag is GridViewColumn gvc)
{
gvc.Width = 100;
}
}

我不知道关于GridViewColumns作为VisualChildren的问题的答案,但我能够获得一个代码背后的解决方案沿着以下行,其中
视图是timeableview(包含ListView/GridView), ViewModel是timeableviewmodel和StaffColumnWidth一个ViewModel属性绑定到列宽度。有点笨拙,但是很好用。

private void Button_Click(object sender, RoutedEventArgs e)
{
var vm = DataContext as  TimeTableViewModel;
vm.StaffColumnWidth=100;
}

最新更新