如何在 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 后面。我该如何解决这个问题。我必须编写代码以取消附加此元素的位置。
您的错误仅意味着在 WPF 中,不能同时多次显示相同的 UI 元素。你有两个选择...您可以在将它添加到其他地方之前从 UI 中删除一个,或者您可以伪造它。
我的意思是伪造它,您可以在其他地方重新创建 UI 元素,而不是实际复制控件。您可以通过创建相同类型的新元素来执行此操作,也可以通过DataTemplate
和ContentControl
显示 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
。