我试图在WPF树视图中使用第三方DLL对象类型作为数据模板。出于某种原因," rdb:Element"找不到对象类型,但是我可以在代码中全天使用,甚至在其他地方绑定到这个对象类型,但似乎无法以这种方式引用它。有人可以帮助我理解为什么我不能以这种方式获得这种特定的数据类型吗?
请参阅" "在下面的代码行。我得到了" Element在名称空间中不存在......"错误。
<Window x:Class="Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:LotSpec.Revit"
xmlns:rdb="clr-namespace:Autodesk.Revit.DB;assembly=RevitAPI"
xmlns:m="clr-namespace:LotSpec.Revit.Models"
mc:Ignorable="d"
Title="Window1" Height="300" Width="300">
<Grid>
<TreeView ItemsSource="{Binding ObjectOptions}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type m:ObjectOpt}" ItemsSource="{Binding Elems}">
<TextBlock Text="{Binding Rule}"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type rdb:Element}">
<TextBlock Text="{Binding Converter={StaticResource ElemToDisplayName}}" Margin="3"/>
</DataTemplate>
</TreeView.Resources>
</TreeView>
</Grid>
答案 0 :(得分:0)
我不确定为什么不允许您绑定到Element
类型,但是我一直在做这件事,为什么我认为绑定到{{1 }}对象。
通常,在处理WPF时,您将需要双向绑定之类的东西。单击用户界面中的复选框应更新属性,反之亦然。为确保其正常工作,您需要这些类来实现Element
接口。从外部库绑定到对象的问题是您无法控制在那里实现的接口。当然,您可以扩展它们。我本来会玩的。无论如何,关键是,在执行WPF时,我希望拥有控制权,并始终为任何Revit DB对象创建包装器类。例如,我需要一个UI元素,它是一个复选框,并使用名称在对象之间进行比较。我可以通过在Revit API中围绕IPropertyChanged
创建包装类来实现。在这种情况下,我包装了Element
。
DimensionType
注意public class DimensionStyleWrapper : INotifyPropertyChanged
{
public string Name { get; set; }
public int Id { get; set; }
[JsonIgnore]
public object Self { get; set; }
public DimensionStyleWrapper()
{
}
public DimensionStyleWrapper(DimensionType t)
{
Name = t.Name;
Id = t.Id.IntegerValue;
Self = t;
}
/// <summary>
/// Method that validates that the current Dimension Style Wrapper is still a valid
/// object in context of provided Revit Document.
/// </summary>
/// <param name="doc">Revit Document.</param>
/// <returns>True if wrapper is valid or was validated, otherwise false.</returns>
public bool Validate(Document doc)
{
var e = doc.GetElement(new ElementId(Id));
if (e == null || e.Name != Name)
{
var dt = new FilteredElementCollector(doc)
.OfClass(typeof(DimensionType))
.WhereElementIsElementType()
.FirstOrDefault(x => x.Name == Name);
if (dt != null)
{
Id = dt.Id.IntegerValue;
Self = dt;
return true;
}
return false;
}
return true;
}
public override bool Equals(object obj)
{
var item = obj as ViewWrapper;
return item != null && Name.Equals(item.Name);
}
public override int GetHashCode()
{
return Name.GetHashCode();
}
public event PropertyChangedEventHandler PropertyChanged;
private void RaisePropertyChanged(string propname)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propname));
}
}
界面。当我在WPF IPropertyChanged
或ComboBox
中使用该类并且需要双向绑定时,这很方便。我还创建了自己的CheckBox
覆盖以使用对象Equals
作为确定两个对象是否相同的一种方式。我那里还有一个Name
例程,可以确保如果给定的类是从JSON序列化的,则它实际上存在于给定的模型中。对于踢球者,我有一个名为Validate
的属性,该属性用于存储对来自数据库的原始Self
的引用。我并不总是使用它,但是有时候它很方便。我总是可以使用DimensionType
和Id
获取最新的对象。无论如何,我要说的是,对于WPF UI设计,您想完全控制要绑定到的对象的行为,因此创建自定义包装器类对我来说是一个很好的工作流程。