【问题标题】:Binding to property of usercontrol from WPF MVVM Caliburn.Micro application doesn't work从 WPF MVVM Caliburn.Micro 应用程序绑定到用户控件的属性不起作用
【发布时间】:2015-12-20 12:15:33
【问题描述】:

在 MS VS2015 Professional 中,我使用 MVVM 模式使用 Caliburn.Micro 开发 WPF 应用程序。我在我的应用程序中使用用户控件。用户控件也是用 Caliburn.Micro 开发的,但不是在 MVVM 中开发的。用户控件有两个依赖属性:

public static DependencyProperty XmaxProperty =
                  DependencyProperty.Register("Xmax", typeof(double),
                  typeof(LineChart),
                  new FrameworkPropertyMetadata(10.0, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

public double Xmax
{
    get { return (double)GetValue(XmaxProperty); }
    set { SetValue(XmaxProperty, value); }
}

public static readonly DependencyProperty DataCollectionProperty = DependencyProperty.Register("DataCollection",
          typeof(BindableCollection<LineSeriesControl>), typeof(LineChart),
          new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnDataChanged));

public BindableCollection<LineSeriesControl> DataCollection
{
    get { return (BindableCollection<LineSeriesControl>)GetValue(DataCollectionProperty); }
    set { SetValue(DataCollectionProperty, value); }
}

private static void OnDataChanged(object sender, DependencyPropertyChangedEventArgs e)
{
    var lc = sender as LineChart;
    var dc = e.NewValue as BindableCollection<LineSeriesControl>;
    if (dc != null)
        dc.CollectionChanged += lc.dc_CollectionChanged;
}

private void dc_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (DataCollection != null)
    {
        CheckCount = 0;
        if (DataCollection.Count > 0)
            CheckCount = DataCollection.Count;
    }
}

在我的应用程序中,我定义了两个属性:

public BindableCollection<LineSeriesControl> DataCollection { get; set; }

public Double Xmax { get; set; }

在我的应用程序的 MainWindowView.xaml 文件中,我将用户控件包含到我的应用程序中

xmlns:local="clr-namespace:ChartControl;assembly=ChartControl"

其中 ChartControl 是控件的名称并创建绑定:

<local:LineChart Grid.Row="2" Grid.Column="0" DataCollection="{Binding DataCollection}" Xmax="{Binding Xmax}"/>

然后通过按钮点击下一段代码执行:

public void DisplayChart()
{
    this.DataCollection.Clear();
    LineSeriesControl ds = new LineSeriesControl();
    . . . . . . . . . . . . . . . . . .
    for (int i = 0; i < 50; i++)
    {
        double x = i / 5.0;
        double y = Math.Sin(x);
        ds.LinePoints.Add(new Point(x, y));
    }
    . . . . . . . . . . . . . . . . . . . . . . .
    this.Xmax = ds.LinePoints.Count + 100;
    . . . . . . . . . . . . . . . . . . . . . . .
    this.DataCollection.Add(ds);
}

Xmax 由 150 分配(我已在调试器中检查过),并且在 DataCollection 中添加了 LineSeriesControl 的一个实例。 DataCollection 绑定得很好,用户控件中的代码也很好地使用了它但是 Xmax 的绑定不成功。 usercontrol 中的属性 Xmax 的值为 0。为什么它有位置?我做错了什么?请帮忙。

【问题讨论】:

    标签: c# wpf mvvm caliburn.micro


    【解决方案1】:

    您必须在属性上调用 PropertyChanged 事件,以便绑定的 DP 通过绑定获取新值。

     private Double _xmax;
     public Double Xmax 
     { 
        get{ return _xmax;} 
        set
        {
             _xmax = value;
             NotifyOfPropertyChange(() => Xmax);
        }
    

    【讨论】:

    • 据我所知,Caliburn.Micro 有 INotifyPropertyChanged 的​​内部实现,因此如果我使用 Caliburn.Micro,我不应该在我的应用程序中显式实现它。
    • 比你错过的理解。您可能的意思是他们在您的视图模型派生的 PropertyChangedBase 中公开了 NotifyOfPropertyChanged。它可能源自 Screen,它的层次结构源自 PropertyChangedBase
    • 很高兴听到。排除 SO 上的答案很重要。
    • 顺便说一句。作为继承自 ObservableCollection 的 BindableCollection 的另一面,它旨在用于您的 vm 并更新为在您的控件中实现 IList 的任何集合。 ObservableCollection 将是更新控件中列表的那个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 2011-09-06
    • 2015-06-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多