是否可以仅使用数据绑定在Silverlight中创建路径?
我想动态地创建一个由几个BezierSegments组成的路径 我希望绑定数据,以便我的数据源只需要提供数字。 i、 e.应用程序不应在代码中创建任何几何体对象 这可能吗 更新: 以下是固定数量路径段的示例:是否可以仅使用数据绑定在Silverlight中创建路径?,silverlight,data-binding,path,Silverlight,Data Binding,Path,我想动态地创建一个由几个BezierSegments组成的路径 我希望绑定数据,以便我的数据源只需要提供数字。 i、 e.应用程序不应在代码中创建任何几何体对象 这可能吗 更新: 以下是固定数量路径段的示例: <Path Stroke="Black"> <Path.Data> <PathGeometry> <PathFigure StartPoint ="{Binding CalculatedPointA,
<Path Stroke="Black">
<Path.Data>
<PathGeometry>
<PathFigure StartPoint ="{Binding CalculatedPointA, Mode=OneWay}">
<LineSegment Point="{Binding CalculatedPointB, Mode=OneWay}" />
<LineSegment Point="{Binding CalculatedPointC, Mode=OneWay}" />
<LineSegment Point="{Binding CalculatedPointA, Mode=OneWay}" />
</PathFigure>
</PathGeometry>
</Path.Data>
</Path>
我希望有一个可变数量的段。您实际问题的答案是:不,不可能在不使用代码的情况下(或在某些第三方编写了代码的情况下,使用附加组件)将数据以这种方式绑定以动态创建路径图形或段
这个问题是出于不需要编写代码的愿望,还是有理由相信您不应该这样做?您实际问题的答案是:不,不可能将数据绑定到这样的位置,以便在不使用代码的情况下动态创建路径图形或分段(或在某些第三方编写了代码的情况下使用附加组件)
这个问题是因为不想在没有必要的情况下编写代码,还是有理由相信不应该编写代码?将XAML中Path元素上的数据属性绑定到视图模型中String类型的DependencyProperty。使用代码构建Path语句的字符串表示形式:“F0 M 10,10 L100,10 A 1,1,1,1110,10 L 200,10” 这里是酒店:
Public Shared ReadOnly PathDataProperty As DependencyProperty = DependencyProperty.Register("PathData", GetType(System.String), GetType(LineViewModel), Nothing)
Public Property PathData As String
Get
Return Me.GetValue(PathDataProperty)
End Get
Set(ByVal value As String)
Me.SetValue(PathDataProperty, value)
RaisePropertyChanged(MethodBase.GetCurrentMethod().Name.Substring(4))
End Set
End Property
以下是XAML:
<Path x:Name="PrimaryPath"
StrokeThickness="{Binding LineThickness, Source={StaticResource LineVM}, Mode=OneWay}"
Stroke="{Binding LineColor, Source={StaticResource LineVM}, Mode=OneWay}"
Data="{Binding PathData, Source={StaticResource LineVM}, Mode=OneWay, Converter={StaticResource myConv}}">
</Path>
从下载StringToPathGeomertry转换器
您应该已经设置好了!将XAML中Path元素的数据属性绑定到视图模型中字符串类型的DependencyProperty。使用代码构建Path语句的字符串表示形式:“F0 M 10,10 L100,10 a 1,1,1,1110,10 L 200,10” 这里是酒店:
Public Shared ReadOnly PathDataProperty As DependencyProperty = DependencyProperty.Register("PathData", GetType(System.String), GetType(LineViewModel), Nothing)
Public Property PathData As String
Get
Return Me.GetValue(PathDataProperty)
End Get
Set(ByVal value As String)
Me.SetValue(PathDataProperty, value)
RaisePropertyChanged(MethodBase.GetCurrentMethod().Name.Substring(4))
End Set
End Property
以下是XAML:
<Path x:Name="PrimaryPath"
StrokeThickness="{Binding LineThickness, Source={StaticResource LineVM}, Mode=OneWay}"
Stroke="{Binding LineColor, Source={StaticResource LineVM}, Mode=OneWay}"
Data="{Binding PathData, Source={StaticResource LineVM}, Mode=OneWay, Converter={StaticResource myConv}}">
</Path>
从下载StringToPathGeomertry转换器
你应该准备好了!我在纯MVVM设置中工作,所以我尽量避免代码落后,并在ViewModels中动态创建框架元素。@elggarc:我听说很多。MVVM不能执行魔法,必须有人在某处编写代码。你认为MVVM会阻止代码的创建吗?如果是,你基于什么?我发现m任何MVVM信条的拥护者都没有正确理解它的目标。在这种情况下,没有理由不编写一些代码来交付应用程序的这个纯粹的视觉组件。这很方便,因为如果有理由,你会被一种方法所束缚,这种方法禁止做一些必要的事情。请输入代码视图无法进行单元测试,因此我们尽可能将代码保留在视图模型中,并将视图保留为纯XAML。显然,这并不总是可能的,而且视图中确实存在一些视图特定的代码,这是不可避免的。@elggarc:有时我认为过于强调了这一点,“但我们不能在视图中对代码进行单元测试。”"事情是这样的。大量复杂的跳转接着会产生比实际需要多得多的代码来完成需求。在某些情况下,我怀疑通过单元测试减轻的风险会被过度复杂的代码所固有的风险抵消。通常,当某些东西本质上纯粹是视觉的时候,让视图来处理它,只需记住其他良好的实践仍然适用,例如创建可重用的控件。我在纯MVVM设置中工作,因此我尝试避免代码落后,并在ViewModels中动态创建框架元素。@elggarc:我听说很多。MVVM不能执行魔法,必须有人在某处编写代码。你认为MVVM妨碍了创造性吗在代码的基础上?如果是这样的话,你的基础是什么?我发现很多MVVM信条的拥护者没有正确理解它的目标。在这种情况下,没有什么好的理由,不管是否基于MVVM,为什么你不应该写一些代码来交付你的应用程序的这个纯粹的视觉组件。这很方便,因为如果有理由的话,你会被困在一个禁止做必要的事情的方法论。视图中的代码无法进行单元测试,因此我们尽可能将代码保留在视图模型中,并将视图保留为纯XAML。显然,这并不总是可能的,我们确实在视图中有一些视图特定的代码,这是不可避免的。@elggarc:有时我觉得太强调了“但是我们不能在视图中对代码进行单元测试”事情是这样的。大量复杂的跳转接着会产生比实际需要多得多的代码来完成需求。在某些情况下,我怀疑通过单元测试减轻的风险会被过度复杂的代码所固有的风险抵消。通常,当某些东西本质上纯粹是视觉的时候,让视图来处理但是,请记住,其他良好实践仍然适用,例如创建可重用控件。