数据绑定到属性是有效的,但不是更新

时间:2015-07-21 23:11:32

标签: c# wpf caliburn.micro

我有模特的财产:

private EditorSelectionTool SelectionTool { get; set; }

结合:

 <DataTemplate DataType="{x:Type viewModels:EditorSelectionTool}">
                    <Rectangle Stroke="White" StrokeThickness="1" StrokeDashArray="4 4" Width="{Binding Width}" Height="{Binding Height}" Visibility="{Binding Visibility}"/>
                </DataTemplate>

模型源自PropertyChangedBase类(Caliburn.Micro)

更改属性字段的方法:

 public void StartSelecting(Point point)
    {
        SelectionTool.X = point.X;
        SelectionTool.Y = point.Y;
        NotifyOfPropertyChange(() => SelectionTool);
    }

Debug显示调用了该方法。但是UI的变化并没有发生。

SelectionTool类:

   public class EditorSelectionTool
{
    public double X { get; set; }
    public double Y { get; set; }
    public double Width { get; set; }
    public double Height { get; set; }
    public Visibility Visibility { get; set; }
}

3 个答案:

答案 0 :(得分:2)

您正在名为SelectionTool的属性上触发属性更改事件。但是,您从未在高度和可见性上触发属性更改事件。

在某些情况下这会起作用 - 这取决于某些东西是否实际上绑定到SelectionTool。在这种情况下,它将迫使绑定进一步“沿着链”进行重新加载。但是,由于您遇到问题,我认为这不适用于您的特定绑定方案。

在Visual Studio中,输出窗口通常包含有关绑定失败的信息。

答案 1 :(得分:1)

看到您正在使用Caliburn.Micro,您需要更新EditorSelectionTool以实施PropertyChangedBase,正如Paul K所提到的,将属性更改通知添加到每个媒体资源。

public class EditorSelectionTool : PropertyChangedBase 
{
    private double _x;
    private double _y;
    private double _width;
    private double _height;
    private Visibility _visibility;

    public double X
    {
        get { return _x; }
        set
        {
            _x = value;
            NotifyOfPropertyChange(()=> X);
        }
    }

    public double Y
    {
        get { return _y; }
        set
        {
            _y = value;
            NotifyOfPropertyChange(() => Y);
        }
    }

    public double Width
    {
        get { return _width; }
        set
        {
            _width = value;
            NotifyOfPropertyChange(() => Width);
        }
    }

    public double Height
    {
        get { return _height; }
        set
        {
            _height = value;
            NotifyOfPropertyChange(() => Height);
        }
    }

    public Visibility Visibility
    {
        get { return _visibility; }
        set
        {
            _visibility = value;
            NotifyOfPropertyChange(() => Visibility);
        }
    }
}

答案 2 :(得分:1)

您在SettingTool上通知了更改,但该属性根本没有更改。它是相同的实例,因此没有变化。

即使您通知了更改,WPF也会通过将旧版本与当前值(此处为SettingTool的实例)进行比较来检查是否确实存在更改。

  1. 创建EditorSelectionTool的新实例,将其分配给属性并通知更改
    1. EditorSelectionTool
    2. 中的每个属性上实施更改通知