【问题标题】:Complex databinding issue复杂的数据绑定问题
【发布时间】:2015-01-05 22:45:28
【问题描述】:

我正在尝试开发一个数据绑定的折线画布。 目前我数据绑定了一个类列表,每个类都包含一个点集合和一个偏移量。但是,我想进一步自定义这些行中的每一个,例如它们的颜色。因此,我想在包含折线模型类的类中创建一个列表。其中包含点集合、偏移 X、Y 和折线颜色数据。

目前看起来是这样的:

                <Canvas Name="PolyLineCanvas" Width ="100" Height="100">
                    <ItemsControl ItemsSource="{Binding WaypointList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <Canvas/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemContainerStyle>
                            <Style TargetType="ContentPresenter">
                                <Setter Property="Canvas.Left" Value="{Binding Path=TracedPathLeft, UpdateSourceTrigger=PropertyChanged}"/>
                                <Setter Property="Canvas.Top" Value="{Binding Path=TracedPathTop, UpdateSourceTrigger=PropertyChanged}"/>
                            </Style>
                        </ItemsControl.ItemContainerStyle>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <Polyline Stroke="Magenta" Points="{Binding TracedPath}" StrokeThickness="0.0244"></Polyline>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </Canvas>

和类:

public class WaypointListModel : INotifyPropertyChanged
{

    public class Waypoint : INotifyPropertyChanged
    {
        ObservableCollection<Waypoint> wptList;

        PointCollection tracedPath;
        double tracedPathTop;
        double tracedPathLeft;

        public Waypoint(ObservableCollection<Waypoint> WptList)
        {
            wptList = WptList;
        }

        public PointCollection TracedPath
        {
            get
            {
                return tracedPath;
            }
            set
            {
                tracedPath = value;
            }
        }

        public double TracedPathTop
        {
            get
            {
                return tracedPathTop;
            }
            set
            {
                tracedPathTop = value;
            }
        }

        public double TracedPathLeft
        {
            get
            {
                return tracedPathLeft;
            }
            set
            {
                tracedPathLeft = value;
            }
        }

        public void NotifyCanvas() //Method being called when pressing an update button
        {
            NotifyPropertyChanged("TracedPathTop");
            NotifyPropertyChanged("TracedPathLeft");
            NotifyPropertyChanged("TracedPath");
        }

        #region INotifyPropertyChanged Members

        public event PropertyChangedEventHandler PropertyChanged;

        private void NotifyPropertyChanged(string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }
        #endregion
    }

    ObservableCollection<Waypoint> waypointList = new ObservableCollection<Waypoint>();

    public ObservableCollection<Waypoint> WaypointList
    {
        get
        {
            return waypointList;
        }
        set
        {
            waypointList = value;

            NotifyPropertyChanged("WaypointList");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion
}

这是我制作的 polylineModel 类(类似于上面的那个):

class WayPointPolyline : INotifyPropertyChanged
{
    SolidColorBrush tracedPathColour;
    PointCollection tracedPath;
    double tracedPathTop;
    double tracedPathLeft;

    public SolidColorBrush TracedPathColour
    {
        get
        {
            return tracedPathColour;
        }
        set
        {
            tracedPathColour = value;
            NotifyPropertyChanged("TracedPathColour");
        }
    }

    public PointCollection TracedPath
    {
        get
        {
            return tracedPath;
        }
        set
        {
            tracedPath = value;
            NotifyPropertyChanged("TracedPath");
        }
    }

    public double TracedPathTop
    {
        get
        {
            return tracedPathTop;
        }
        set
        {
            tracedPathTop = value;
            NotifyPropertyChanged("TracedPathTop");
        }
    }

    public double TracedPathLeft
    {
        get
        {
            return tracedPathLeft;
        }
        set
        {
            tracedPathLeft = value;
            NotifyPropertyChanged("TracedPathLeft");
        }
    }

    #region INotifyPropertyChanged Members

    public event PropertyChangedEventHandler PropertyChanged;

    private void NotifyPropertyChanged(string propertyName = "")
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }
    #endregion

}

但是在名为 Waypoint 的类中

我想将 PointCollection 替换为:

        public List<WayPointPolyline > TracedPaths
        {
            get
            {
                return tracedPaths;
            }
            set
            {
                tracedPaths = value;
            }
        }

xaml 是最困难的部分,因为目前它只为列表中添加的每个类添加一个点集合,我需要的是一个列表,您可以在其中添加 x 个类,x 类可以包含 y 行的数据。知道该怎么做吗?

提前致谢!

【问题讨论】:

  • 是什么阻止您这样做并在现有的ItemsControl.ItemTemplate 中添加新的ItemsControl

标签: c# wpf polyline


【解决方案1】:

感谢 Chris Eelmaa 的提示!

Xaml 应该如下所示:我没有注意到性能上有任何显着差异。然而,作为一个业余爱好者,知道下面的代码是否“太乱”会很有趣

                <Canvas Name="PolyLineCanvas" Width ="100" Height="100">
                    <ItemsControl ItemsSource="{Binding WaypointList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True}">
                        <ItemsControl.ItemsPanel>
                            <ItemsPanelTemplate>
                                <Canvas/>
                            </ItemsPanelTemplate>
                        </ItemsControl.ItemsPanel>
                        <ItemsControl.ItemTemplate>
                            <DataTemplate>
                                <ItemsControl ItemsSource="{Binding TracedPathList,Mode=TwoWay,UpdateSourceTrigger=PropertyChanged,NotifyOnTargetUpdated=True}">
                                        <ItemsControl.ItemsPanel>
                                            <ItemsPanelTemplate>
                                                <Canvas/>
                                            </ItemsPanelTemplate>
                                        </ItemsControl.ItemsPanel>
                                        <ItemsControl.ItemContainerStyle>
                                            <Style TargetType="ContentPresenter">
                                                <Setter Property="Canvas.Left" Value="{Binding Path=TracedPathLeft, UpdateSourceTrigger=PropertyChanged}"/>
                                                <Setter Property="Canvas.Top" Value="{Binding Path=TracedPathTop, UpdateSourceTrigger=PropertyChanged}"/>
                                            </Style>
                                        </ItemsControl.ItemContainerStyle>
                                        <ItemsControl.ItemTemplate>
                                            <DataTemplate>
                                            <Polyline StrokeDashArray="{Binding TracedPathDashStyle}" Stroke="{Binding TracedPathColour}" Points="{Binding TracedPath}" StrokeThickness="0.0244"></Polyline>
                                            </DataTemplate>
                                        </ItemsControl.ItemTemplate>
                                    </ItemsControl>
                            </DataTemplate>
                        </ItemsControl.ItemTemplate>
                    </ItemsControl>
                </Canvas>

【讨论】:

    猜你喜欢
    • 2018-12-06
    • 1970-01-01
    • 2012-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-28
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多