我目前正在使用WPF和基础控件开发.NET 4.7应用程序。
我需要根据数据源列表中的每个元素来设置每个元素的With
、Height
、YMemberPath
和XMemberPath
。
我使用图表XamDataChart
,它显示了List<ChartData>
的几个点。ChartData
类如下所示:
public class ChartData
{
public double Width { get; set; }
public double Height { get; set; }
public double XPos { get; set; }
public double YPos { get; set; }
}
目前,这些值是在我的ViewModel的构造函数中设置的:
ChartData data = new ChartData
{
Width = 400,
Height = 200,
XPos = 100,
YPos = 100
};
我的XAML如下所示:
<ig:XamDataChart.Series>
<ig:ScatterSeries
MarkerType="Square"
ItemsSource="{Binding ChartDataList}"
YMemberPath="YPos"
XMemberPath="XPos"
XAxis="{Binding ElementName=XAxis}"
YAxis="{Binding ElementName=YAxis}">
<ig:ScatterSeries.MarkerStyle>
<Style TargetType="{x:Type ig:Marker}">
<Setter Property="Width" Value="{Binding RelativeSource={RelativeSource Self}, FallbackValue=20}"/>
<Setter Property="Height" Value="{Binding RelativeSource={RelativeSource Self}, FallbackValue=20}"/>
</Style>
</ig:ScatterSeries.MarkerStyle>
</ig:ScatterSeries>
</ig:XamDataChart.Series>
不幸的是,我的元素无法正确绘制,我不知道自己做错了什么。
标记样式部分中的"宽度"one_answers"高度"设置器根本不受尊重
你对如何解决这个问题有什么想法吗?
我需要用适当的高度和宽度在XPos和YPos处绘制每个没有边距或填充的元素。
非常感谢!!
我认为您需要实现属性更改通知。当确定并设置或更改宽度和高度的源值时,需要将此更改通知目标。这将让您知道如何做到这一点:更改通知。
基本上,您需要实现INotifyPropertyChanged,并在值更改时在每个属性调用OnPropertyChanged((
编辑1:我不遵守。您正在为"高度"one_answers"宽度"使用绑定。这意味着您希望在正常操作期间更新这些值。如果不正确,请使用硬编码值。
此外,您的值没有得到尊重,因为它们是在UI初始化后运行的构造函数中设置的。如果没有更改通知,构造函数中的值将不会得到尊重(这就是为什么在启动时没有正确设置它们的原因(。
您可以在其定义中初始化您的值,例如:
public double Width { get; set; } = 400;
该值在初始化期间应用,并且应该在启动期间应用于初始UI布局——但是,在没有更改通知的情况下,它将变为静态(未更改(值。
但是,您需要更正绑定。您的绑定是到RelativeSource,但绑定到它自己。这意味着您正在将控件的"宽度"绑定到其自身。您需要使用ElementName=和实际数据项的Path绑定到数据源,例如Path=data.Width。这是近似值,因为您的代码不足以理解全貌。然而,同样,在没有更改通知的情况下,对数据进行更改。宽度不会更新。
编辑2:您也可以以"传统"方式更新值。也就是说,使用控件的名称和属性名称,并在代码中设置值。这样做,绑定将被忽略。