【问题标题】:Getting a cell container from WPF ListView从 WPF ListView 获取单元格容器
【发布时间】:2015-07-09 09:11:52
【问题描述】:

我有一个组件的列表视图,该组件绑定到 BreakdownViewRow 类型的可观察集合。

每个单元格都包含一个在 EDIT 和 DISPLAY 模式下运行的组件。

我需要找到一种方法来以编程方式更改单元格内容的模式,但尝试迭代列表视图中的项目会返回 BreakdownViewRow 类型的对象。

有没有一种方法可以访问包含每个组件的单元格,而不是获取可观察集合中存在的项目?

我的组件的代码(ContainerSelected 事件绑定在 XAML 中,并正确触发传递 EditableControlContainer 对象作为发送者):

public partial class ArrearsBreakdownView : UserControl
{
    private ObservableCollection<BreakdownViewRow> rows;

    public ObservableCollection<BreakdownViewRow> Rows {
        get { return rows; }
        set { rows = value; }
    }

    public BreakdownView() {
        InitializeComponent();
        rows = new ObservableCollection<BreakdownViewRow>();

        Populate();
        this.DataContext = this;
    }

    public void Populate() {
        rows.Add(new BreakdownViewRow(2015, 1000.50M, "TE1 \t Test Code 1", "This is a test row"));
        rows.Add(new BreakdownViewRow(2014, 100M, "TE1 \t Test Code 1", "Another row"));
        rows.Add(new BreakdownViewRow(2013, 150M, "TE1 \t Test Code 1", "This is a test row"));
    }

    public void ContainerSelected(object sender, RoutedEventArgs e) {
        EditableControlContainer ecc = (EditableControlContainer)sender;
        foreach (ListViewItem item in grdArrears.Items) {
            //Here, I get a BreakdownViewRow object, when what I need is the EditableControlContainer object,
            //or the cell container
        }
        int stop = 1;
    }
}

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    您可以尝试使用ItemContainerGenerator。它会返回该行的容器,但您可以使用TreeViewHelper 获取每个单元格的ContentPresenters,然后在每个ContentPresenter 的模板中查找您的控件:

    public void ContainerSelected(object sender, RoutedEventArgs e) {
        EditableControlContainer ecc = (EditableControlContainer)sender;
        ItemContainerGenerator generator = grdArrears.ItemContainerGenerator;
    
        foreach (var item in grdArrears.Items) {
            var itemContainer = generator.ContainerFromItem(item);
    
            foreach (var presenter in GetChildrenOfType<ContentPresenter>(itemContainer))
            {
                var myControl = presenter.ContentTemplate.FindName("MyControl", presenter);
                // Do stuff with your cell control
            }
        }
    }
    
    private IEnumerable<T> GetChildrenOfType<T>(DependencyObject parent) where T : DependencyObject
    {
        int childrenCount = VisualTreeHelper.GetChildrenCount(parent);
    
        for (int i = 0; i < childrenCount; i++)
        {
            var child = VisualTreeHelper.GetChild(parent, i);
    
            if (child is T)
                yield return (T)child;
    
            var childrenOfType = GetChildrenOfType<T>(child);
    
            foreach (var childOfType in childrenOfType)
                yield return childOfType;
        }
    }
    

    【讨论】:

    • 不幸的是,这不起作用。返回的项目是一个 ListViewItem,其中包含一个 BreakdownViewRow。
    • 我明白了,您想要获取单元格而不是行,对吗?在那种情况下,这并不容易......您将不得不求助于通过可视化树进行搜索。我将编辑我的答案。
    • 就是这样,我需要获取单元格,以便可以将所有 EditableControlContainer 对象的模式更改为显示,除了已选择的对象。谢谢!
    • 已编辑。请记住,我在这里使用FrameworkTemplate.FindName 函数,如果您可以为要获取的控件设置名称,这是更简单的方法......如果由于某种原因您无法设置名称,让我知道。
    • 这看起来可能是正确的!我现在不在,但当我回来时会试试这个。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-20
    • 2011-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    相关资源
    最近更新 更多