我有模特的财产:
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; }
}
答案 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
的实例)进行比较来检查是否确实存在更改。
EditorSelectionTool
的新实例,将其分配给属性并通知更改或
EditorSelectionTool