我正在编写自己的Panel(WPF)来绘制模型。我有一个Model-DependencyProperty,我希望我的模型的任何更改都会影响LayoutProcess。
ModelProperty = DependencyProperty.Register("Model", typeof(Model), typeof(ModelPanel),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsMeasure));
我应该如何实现我的Model-Class,以便任何更改都会影响LayoutProcess?我尝试过INotifyPropertyChanged。但它没有用。
答案 0 :(得分:1)
对不起,但我想你可能会以错误的方式解决这个问题。
在WPF中,面板应该定义如何布局。
由于您尝试使用面板,我假设您的模型中有一些东西。我们可以使用ListBox
处理集合,我们可以为其提供正确的面板类型。即。
<ListBox ItemsSource="{Binding MyThings}">
<ListBox.ItemsPanel>
<StackPanel Orientation="Vertical"/>
</ListBox.ItemsPanel>
</ListBox>
然而,这通常只给我们一个类名列表,每个类代表一个你的东西,你需要告诉WPF如何显示它,为此你使用DataTemplate
。您可以在许多地方,资源部分(控件,窗口或应用程序)或您需要的地方定义它们。
<ListBox ItemsSource="{Binding MyThings}">
<ListBox.ItemsPanel>
<StackPanel Orientation="Vertical"/>
</ListBox.ItemsPanel>
<ListBox.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}"/> <!-- Assuming each thing has a name property-->
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
更新: 或者,如果您要显示不同类型的项目
<ListBox ItemsSource="{Binding MyThings}">
<ListBox.ItemsPanel>
<Canvas/>
</ListBox.ItemsPanel>
<ListBox.Resources>
<DataTemplate TargetType="{x:Type MyLine}">
<Line x1="{Binding Left}" x2="{Binding Right}"
y1="{Binding Top}" y2="{Binding Bottom}"/>
</DataTemplate>
<DataTemplate TargetType="{x:Type MyRectangle}">
<Border Canvas.Left="{Binding Left}" Canvas.Right="{Binding Right}"
Canvas.Top="{Binding Top}" Canvas.Bottom="{Binding Bottom}"/>
</DataTemplate>
</ListBox.Resources>
</ListBox>
还有一个阅读Josh Smith's article on MVVM,它有很多例子和良好实践,并将引入一种模式,让你的模型更清洁。