Silverlight DataGrid:在行详细信息模板中设置控件的可见性?

时间:2015-02-12 16:12:12

标签: c# silverlight datagrid

我有一个实例,其中详细信息模板中有两个主要的堆栈面板。

默认情况下,其中一个设置为折叠。但是,在右键单击并选择时,将触发该堆栈面板的可见性。当行详细信息已经扩展时,可能会发生这种情况。

但是,当展开行详细信息并选择右键单击以查看该堆栈面板时,我会以编程方式将其可见性更改为Visible,但它不会变为可见。

我是否需要进行二次调用以更新UI并强制执行可见性设置?

这是我的代码:

        private void SetWFHistoryVisibility(bool show)
    {
        var elements = VisualTreeHelper.FindElementsInHostCoordinates(position, this);
        var row = (from element in elements
                   where element is DataGridRow
                   select element).FirstOrDefault() as DataGridRow;

        if (row != null)
        {
            DataGridDetailsPresenter presenter = VisualHelper.FindVisualChild<DataGridDetailsPresenter>(row);
            if (presenter.Children.Count > 0)
            {
                var grid = (from el in presenter.Children
                            where el is Grid
                            select el).FirstOrDefault() as Grid;

                if (grid != null)
                {
                    StackPanel wfgc = grid.FindName("wfGridContainer") as StackPanel;
                    if (show)
                        wfc.Visibility = System.Windows.Visibility.Visible;
                    else
                        wfc.Visibility = System.Windows.Visibility.Collapsed;
                }
            }
        }
    }

1 个答案:

答案 0 :(得分:0)

您可能需要根据面板/布局调用DataGridView.Refresh()或等效项。它也可以是父控件,也需要更新/刷新。

我知道在Silverlight DataGrid中确实有AutoRefresh,但它主要由DGV或DataGrid类中的EventTrigger控制。正如你发现它并不完美。

也许您可以触发以下某个事件,并允许Control计算出自己的视图更新。

https://msdn.microsoft.com/en-us/library/system.windows.controls.datagrid(v=vs.110).aspx

这一解决方案:

Dispatcher.BeginInvoke(() => {
//set the added control to be visible
});

MSDN上的用户建议StackPanel刷新。

其他一些建议建议使用以下组合:

_.Invalidate()
_.UpdateLayout()

强制刷新。