DependencyProperty不会触发LayoutProcess

时间:2013-08-28 11:19:48

标签: c# wpf layout dependency-properties

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

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

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

1 个答案:

答案 0 :(得分:1)

对不起,但我想你可能会以错误的方式解决这个问题。

在WPF中,面板应该定义如何布局。

  • StackPanel水平或垂直地放置一个接一个的东西。
  • A WrapPanel在一行/列中放置内容然后换行到下一行。
  • 使用Canvas可以将内容定位在x,y点。

由于您尝试使用面板,我假设您的模型中有一些东西。我们可以使用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,它有很多例子和良好实践,并将引入一种模式,让你的模型更清洁。