0

我正在编写自己的面板(WPF)来绘制模型。我有一个 Model-DependencyProperty,我希望对我的模型的任何更改都会影响 LayoutProcess。

ModelProperty = DependencyProperty.Register("Model", typeof(Model), typeof(ModelPanel),
            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.AffectsMeasure));

我应该如何实现我的模型类,以便任何更改都会影响 LayoutProcess?我试过 INotifyPropertyChanged。但它没有用。

4

1 回答 1

1

对此感到抱歉,但我认为您可能会以错误的方式解决此问题。

在 WPF 中,面板只是用来定义事物的布局方式。

  • StackPanel一个接一个地放置东西,水平或垂直。
  • WrapPanel将事物排成一行/列,然后换行到下一个。
  • 画布可让您将事物定位在 x,y 点。

由于您尝试使用面板,因此我假设您的模型中有一系列东西。我们可以使用 a 来处理集合ListBox,我们可以为其提供正确的面板类型。IE

<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 关于 MVVM 的文章,其中有很多示例和良好实践,并且会介绍一种让您的模型保持清洁的模式。

于 2013-08-28T12:52:46.970 回答