我正在尝试在C# / WPF中创建游戏编辑器。编辑器由一个用户控件组成,显示场景(使用SharpGL渲染OpenGL),以及许多用于编辑当前场景和对象的控件。对象由组件组成,其属性可以在编辑器中进行编辑(类似于Unity游戏引擎)。我已经拥有“组件编辑器”视图,该视图使用反射查找组件上的所有属性,并为每个属性创建属性编辑器(例如,滑块)。然而,我不知道如何在UI和代码之间绑定属性。
问题是,我希望这些属性在代码中更改时能够在UI中更新,以及在UI中更改时能够在代码中更新。如果我想将编辑器控件(例如更改属性的滑块)绑定到组件属性,则它们必须实现NotifyPropertyChanged,这将相当麻烦。我猜另一种方式是脏检查,但我不确定这是否是一个好主意。
有人能给我指点如何处理UI / Code之间的属性更新吗?我希望它的工作方式与Unity中的工作方式基本相同,即您无需在组件类中编写任何额外的东西即可使属性可编辑。
编辑:为了更清楚地说明我正在尝试实现和已经拥有的功能,这里是“组件编辑器”用户控件的一部分。它的数据上下文是一个组件实例(模型)。PropertiesConverter返回它的属性(通过component.GetType().GetProperties())。ComponentPropertyTemplateSelector会在属性编辑器用户控件上进行决策(例如,对于双精度属性,它将选择具有用于编辑值的文本框的“数字编辑器”)。我感兴趣解决的问题是如何将组件的属性与编辑器控件双向绑定。
问题是,我希望这些属性在代码中更改时能够在UI中更新,以及在UI中更改时能够在代码中更新。如果我想将编辑器控件(例如更改属性的滑块)绑定到组件属性,则它们必须实现NotifyPropertyChanged,这将相当麻烦。我猜另一种方式是脏检查,但我不确定这是否是一个好主意。
有人能给我指点如何处理UI / Code之间的属性更新吗?我希望它的工作方式与Unity中的工作方式基本相同,即您无需在组件类中编写任何额外的东西即可使属性可编辑。
编辑:为了更清楚地说明我正在尝试实现和已经拥有的功能,这里是“组件编辑器”用户控件的一部分。它的数据上下文是一个组件实例(模型)。PropertiesConverter返回它的属性(通过component.GetType().GetProperties())。ComponentPropertyTemplateSelector会在属性编辑器用户控件上进行决策(例如,对于双精度属性,它将选择具有用于编辑值的文本框的“数字编辑器”)。我感兴趣解决的问题是如何将组件的属性与编辑器控件双向绑定。
<ItemsControl x:Name="ComponentProperties" Grid.Row="1" ItemTemplateSelector="{StaticResource ComponentPropertyTemplateSelector}">
<ItemsControl.ItemsSource>
<Binding Converter="{StaticResource PropertiesConverter}"/>
</ItemsControl.ItemsSource>
</ItemsControl>
INotifyPropertyChanged
是为此类事情而设计的,并且实际上在 .NET 中早于 WPF 和 MVVM。http://www.codeproject.com/Articles/87715/Native-WPF-PropertyGrid。 - user585968