【问题标题】:Adding a custom control mvvm caliburn添加自定义控件 mvvm caliburn
【发布时间】:2014-07-12 13:47:18
【问题描述】:

我正在编写一个包含不同项目的解决方案。我使用 caliburn micro 编写了 2 个 wpf 客户端。他们都有一个地图控件,可以绘制一些图层和一个列表视图。我想在不同的项目中托管通用控件,以便两个应用程序都可以使用它们。这是我的代码:

    namespace Core.WPF.ViewModels
{
    public class FieldMapControlViewModel : Caliburn.Micro.PropertyChangedBase
    {
        public ObservableCollection<Field> Fields
        {
            get { return new ObservableCollection<Field>(FieldPolys.Select(x => x.Field)); }
        }

        private ObservableCollection<Brush> _brushes;
        public ObservableCollection<Brush> Brushes
        {
            get { return _brushes; }
            set
            {
                _brushes = value;
                NotifyOfPropertyChange(() => Brushes);
                UpdatePolyFill();
                NotifyOfPropertyChange(() => InfoLayer);
            }
        } 


        private ObservableCollection<FieldPoly> _fieldPolys;
        public ObservableCollection<FieldPoly> FieldPolys
        {
            get { return _fieldPolys; }
            set
            {
                _fieldPolys = value;
                NotifyOfPropertyChange(() => FieldPolys);
                NotifyOfPropertyChange(() => Fields);
                NotifyOfPropertyChange(() => InfoLayer);
            }
        }
        private FieldPoly _selectedFieldPoly;
        public FieldPoly SelectedFieldPoly
        {
            get { return _selectedFieldPoly; }
            set
            {
                _selectedFieldPoly = value;
                NotifyOfPropertyChange(() => SelectedFieldPoly);
                NotifyOfPropertyChange(() => SelectedField);
                UpdatePolyFill();

            }
        }

        public Field SelectedField
        {
            get
            {
                if (SelectedFieldPoly != null) return SelectedFieldPoly.Field;
                return null;
            }
            set
            {
                SelectedFieldPoly = FieldPolys.Where(x => x.Field == value).FirstOrDefault();
                NotifyOfPropertyChange(() => SelectedField);
            }
        }

        public ObservableCollection<Control> InfoLayer
        {
            get
            {
                if (FieldPolys.Count() > 0)
                {
                    return new ObservableCollection<Control>(FieldPolys.Select(x => x.Poly));
                }
                return new ObservableCollection<Control>();
            }
        }

        public void UpdatePolyFill()
        {
            foreach (var fp in FieldPolys)
            {
                fp.Poly.GetBindingExpression(MapPolygon.FillProperty).UpdateTarget();
            }
        }
    }

    public class FieldPoly
    {
        public Field Field
        {
            get;
            private set;
        }

        public bool IsSelected
        {
            get { return shell.SelectedFieldPoly == this; }
        }

        FieldMapControlViewModel shell;
        private MapPolygon _poly;
        public MapPolygon Poly
        {
            get { return _poly; }
            private set
            {
                _poly = value;
            }
        }

        public FieldPoly(FieldMapControlViewModel shell, Field field, Brush brush)
        {
            this.shell = shell;
            Field = field;
            Poly = new MapPolygon();
            Poly.Points = new LocationCollection();
            foreach (var point in field.FieldPoints)
            {
                Poly.Points.Add(new Location(point.Y, point.X));
            }
            Binding bind = new Binding("Brush");
            bind.Source = this;

            Poly.SetBinding(MapPolygon.FillProperty, bind);
            Poly.MouseLeftButtonUp += poly_MouseLeftButtonUp;
        }

        private Brush _brush;
        public Brush Brush
        {
            get
            {
                return _brush;
            }
            set
            {
                _brush = value;
            }

        }


    void poly_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {

        shell.SelectedFieldPoly = this;
    }
}

}

如何通过添加以下内容来解决应用程序视图中的此控件:

<Views:FieldMapControlView  FieldPolys={Binding FieldPolys} />

【问题讨论】:

    标签: c# wpf mvvm caliburn.micro


    【解决方案1】:

    我发现我可以添加构造函数

    public FieldMapControlViewModel(IEnumerable<Field> Fields)
                {
                    FieldPolys = new ObservableCollection<FieldPoly>();
                    foreach (var f in Fields)
                    {
                        FieldPolys.Add(new FieldPoly(this, f,System.Windows.Media.Brushes.Red));
    
                    }
    
                }
    

    然后在应用程序的 xaml 中使用

    <Views:FieldMapControlView x:Name="FieldMap" cal:Bind.Model="{Binding FieldMap}"/>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-02
      • 2015-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多