【问题标题】:Is it possible to create a Path in Silverlight solely using data bindings?是否可以仅使用数据绑定在 Silverlight 中创建路径?
【发布时间】:2011-03-28 11:22:54
【问题描述】:

我想动态创建一个由多个 BezierSegments 组成的路径。

我想绑定数据,这样我的数据源只需要提供数字。 即应用程序不应在代码中创建任何几何对象。

这可能吗?

更新:

以下是固定数量路径段的示例:

<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>

我想要可变数量的段。

【问题讨论】:

    标签: silverlight data-binding path


    【解决方案1】:

    您的实际问题的答案是:不,不使用代码(或使用某些第三方编写的代码的附加组件),不可能将数据绑定到动态创建路径图或段。

    这个问题是出于在没有必要时不写代码的愿望,还是有理由相信你不应该写代码?

    【讨论】:

    • 我在纯 MVVM 设置中工作,因此我尽量避免代码落后并在 ViewModels 中动态创建 FrameworkElements。
    • @elggarc:我经常听到。 MVVM 无法执行魔术,必须有人在某个地方编写代码。您是否认为 MVVM 排除了代码的创建?如果是这样,你的依据是什么?我发现许多 MVVM 信条的拥护者并没有正确理解它的目标。在这种情况下,无论是否基于 MVVM,都没有充分的理由为什么不应该编写一些代码来交付应用程序的这个纯粹的可视化组件。这很方便,因为如果出于某种原因,您会被一种方法所束缚,该方法禁止做一些必要的事情。
    • 视图中的代码无法进行单元测试,因此我们尽可能尝试将代码保留在视图模型中,并使视图保持纯 XAML。显然这并不总是可行的,我们在视图中确实有一些视图特定的代码,这是不可避免的。
    • @elggarc:有时我认为“但我们不能在视图中对代码进行单元测试”这件事过分强调了。然后,许多复杂的箍跳会导致创建比实际需要的代码多得多的代码来完成要求。在某些情况下,我怀疑单元测试所减轻的风险会被过于复杂的代码所固有的风险所抵消。通常,当某些东西本质上是纯视觉时,让视图来处理它,记住其他好的做法仍然适用,例如创建可重用的控件。
    【解决方案2】:

    将 XAML 中 Path 元素的 Data 属性绑定到视图模型中 String 类型的 DependencyProperty。使用代码构建 Path 语句的字符串表示形式:“F0 M 10,10 L100,10 A 1,1,1,1,110,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>
    

    http://stringtopathgeometry.codeplex.com/..下载StringToPathGeomertry 转换器。

    你应该准备好了!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-12
      • 2010-10-15
      • 1970-01-01
      • 2019-07-27
      • 2019-06-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多