如何在 MVVM + WPF 中动态取消附加指定的元素

本文关键字:元素 取消 动态 MVVM WPF | 更新日期: 2023-09-27 17:56:34

嗨,我在我的应用程序中使用 wpf mvvm 方法。我收到此错误:-

指定的元素已经是另一个元素的逻辑子元素。首先断开连接。可湿性工作基金会

我写了这样的代码:-在我的 xaml 页面中:

<Border Background="White" BorderThickness="0" x:Name="bdrPdf">
    <ContentControl  x:Name="CntControlPdf"
        MouseDown="Img_MouseDownPdf"
        MouseMove="Img_MouseMovePdf"
        MouseUp="Img_MouseUpPdf"
        Width = "{Binding Path=ViewPageWidth}"
        Height = "{Binding Path=ViewPageHeight}"
        Content="{Binding Path=PDFViewWPFSource,ElementName=root}" >
    </ContentControl>
</Border>

在代码隐藏中:-

public pdftron.PDF.PDFViewWPF PDFViewWPFSource
{
    get { return (pdftron.PDF.PDFViewWPF)GetValue(ImgSourcePropertyPDF); }
    set { SetValue(ImgSourcePropertyPDF, value); }
}
// Using a DependencyProperty as the backing store for PDFViewWPFSource.  This enables animation, styling, binding, etc...
public static readonly DependencyProperty ImgSourcePropertyPDF =
    DependencyProperty.Register("PDFViewWPFSource", typeof(pdftron.PDF.PDFViewWPF), typeof(PageView), new UIPropertyMetadata(default(pdftron.PDF.PDFViewWPF)));

我在动态控制 PDFtron 后面。我该如何解决这个问题。我必须编写代码以取消附加此元素的位置。

如何在 MVVM + WPF 中动态取消附加指定的元素

您的错误仅意味着在 WPF 中,不能同时多次显示相同的 UI 元素。你有两个选择...您可以在将它添加到其他地方之前从 UI 中删除一个,或者您可以伪造它。

我的意思是伪造它,您可以在其他地方重新创建 UI 元素,而不是实际复制控件。您可以通过创建相同类型的新元素来执行此操作,也可以通过DataTemplateContentControl显示 UI 元素。然后,您可以只向 WPF 提供具有相同值的相同类型的新对象,WPF 将以与第一个对象相同的方式呈现它,使其看起来好像您复制了它。


更新>>>

谢谢里登,但我必须像数据绑定一样绑定 ui 元素。我该怎么做?我在运行时添加了多个控件

在 WPF 中,我们不对 UI 元素进行数据绑定。相反,我们声明一个包含元素数据的数据对象(类),然后定义一个将呈现 UI 元素的DataTemplate。然后,我们使用数据对象的类型作为数据绑定属性。举这个简单的例子:

<DataTemplate DataType="{x:Type YourLocalPrefix:YourDataType}">
    <YourUiPrefix:PDFViewWPF DataContext="{Binding}" />
</DataTemplate>

然后,您的属性应如下所示:

public YourDataType PDFViewWPFSource
{
    get { return (YourDataType)GetValue(ImgSourcePropertyPDF); }
    set { SetValue(ImgSourcePropertyPDF, value); }
}

最后,在ContentControl中显示您的 UI 元素:

<ContentControl Content="{Binding PDFViewWPFSource}" />

WPF 框架将看到类型 YourDataType 的对象,找到相关的DataTemplate并呈现您的控件来代替ContentControl