【发布时间】:2015-08-18 20:41:48
【问题描述】:
我正在尝试在 C#/WPF 中创建游戏编辑器。编辑器由一个显示场景的用户控件(使用 SharpGL 在 OpenGL 中渲染)以及许多用于编辑当前场景和对象的控件组成。对象由可以在编辑器中编辑属性的组件组成(有点像 Unity 游戏引擎中的)。我已经有一个“组件编辑器”视图,它使用反射来查找组件上的所有属性,并为每个属性创建一个属性编辑器(例如,一个滑块)。但是,我不确定如何绑定 UI 和代码之间的属性。
问题是,我希望这些属性在代码更改时在 UI 中更新,并在 UI 中更改时在代码中更新。如果我想将编辑器控件(例如更改属性的滑块)绑定到组件属性,则必须实现 NotifyPropertyChanged,这将非常麻烦。我想另一种方法是进行脏检查,但我也不确定这是否是个好主意。
谁能告诉我应该如何处理 UI/代码之间的这个属性更新?我希望它像在 Unity 中一样工作,您无需在组件类中编写任何额外内容即可使属性可编辑。
编辑:为了更清楚地说明我想要实现的目标和已经拥有的目标,这里是“组件编辑器”用户控件的一部分。它的 datacontext 是一个组件实例(模型)。 PropertiesConverter 返回它的属性(通过 component.GetType().GetProperties())。 ComponentPropertyTemplateSelector 决定属性编辑器用户控件(例如,对于双属性,它将选择具有用于编辑值的文本框的“数字编辑器”)。我有兴趣解决的问题是如何将组件的属性双向绑定到编辑器控件。
<ItemsControl x:Name="ComponentProperties" Grid.Row="1" ItemTemplateSelector="{StaticResource ComponentPropertyTemplateSelector}">
<ItemsControl.ItemsSource>
<Binding Converter="{StaticResource PropertiesConverter}"/>
</ItemsControl.ItemsSource>
</ItemsControl>
【问题讨论】:
-
codeproject.com/Articles/87715/Native-WPF-PropertyGrid。请记住,
INotifyPropertyChanged是为这类事情设计的,实际上早于 .NET 中的 WPF 和 MVVM