Datagrid中的FlowDocumentScrollViewer

时间:2013-03-14 08:42:13

标签: c# wpf datagrid flowdocument flowdocumentscrollviewer

我收到以下错误消息:“在附加到新的父视觉”之前必须断开指定子视图与当前父视频的连接“

我知道问题是什么,但我无法在我的实际应用程序中修复它,我使用BeginningEdit()事件弹出一个新窗口来编辑myObject,其中包含麻烦制造者Flowdocument

我还使用我的克隆扩展来创建new Flowdocument,希望能否定此错误,但它不会改变任何内容

XAML

<DataGrid AutoGenerateColumns="False" Name="myDGrid">        
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="myHeader">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <FlowDocumentScrollViewer Width="100" Height="50"                                
                                                      HorizontalScrollBarVisibility="Hidden" 
                                                      VerticalScrollBarVisibility="Hidden" 
                                                      FontStretch="Normal" FontSize="13" FontWeight="Bold" 
                                                      HorizontalContentAlignment="Center" 
                                                      VerticalContentAlignment="Center"  
                                                      IsManipulationEnabled="False" IsSelectionEnabled="False"
                                                     Document="{Binding}">                                
                            </FlowDocumentScrollViewer>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>

                <DataGridTemplateColumn.CellEditingTemplate>
                    <DataTemplate>
                        <Label/>
                    </DataTemplate>
                </DataGridTemplateColumn.CellEditingTemplate>

                </DataGridTemplateColumn>
            </DataGrid.Columns>               
        </DataGrid>

代码隐藏

    public string myFlowString
    {
        get
        {
            return (@"<FlowDocument PagePadding='0,0,0,0' Background='Green' AllowDrop='True' xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'>
                            <Paragraph Background='Red' TextAlignment='Center'> some text befor <LineBreak/> Komponente 1<Run FontFamily='Palatino Linotype' Typography.Variants='Superscript'>1,2,3,4</Run>
                                <LineBreak/> Nachtisch</Paragraph> </FlowDocument>");
        }
    }

    public MainWindow()
    {
        InitializeComponent();

         var _mylist = new List<FlowDocument>();

        var myFlowDoc = XamlReader.Load(XmlReader.Create(new StringReader(myFlowString))) as FlowDocument;



        for (int i = 0; i < 10;i++ )
            _mylist.Add(myFlowDoc.Clone());

        myDGrid.ItemsSource = _mylist;
    }

}

public static class Extension
{
    public static FlowDocument Clone(this FlowDocument flowdoc)
    {
        var xml = XamlWriter.Save(flowdoc);
        return xml.toFlowDocument();
    }

    public static FlowDocument toFlowDocument(this string xamlString)
    {
        var stringReader = new StringReader(xamlString);
        var xmlReader = System.Xml.XmlReader.Create(stringReader);

        return XamlReader.Load(xmlReader) as FlowDocument;
    }
}

1 个答案:

答案 0 :(得分:1)

确定要解决此问题,您应该每DataGridCell使用2个属性 一个用于CellTemplate,另一个用于CellEditingTemplate

每当你的getter被调用时,你必须创建一个新的FlowDocument,因为它会在DataGridCell如何保存这些数据时出现错误/故障。