【问题标题】:Adding bindable property to a UserControl将可绑定属性添加到 UserControl
【发布时间】:2015-07-27 06:58:02
【问题描述】:

目的

该控件的目的是以 6x2 网格的形式显示 12 个按钮。单击按钮应将 VM 的 ActiveLayer 属性设置为单击按钮的索引(1 到 12)。 UserControl 应该通过将按钮的 Background 更改为 SkyBlue 来突出显示当前层。

步骤

以下是我采取的步骤:

  1. 在我的用户控件中添加了一个名为 ActiveLayerDependencyProperty。这个依赖属性的PropertyChangedCallBack 更新按钮的Background(见底部)。
  2. 在 XAML 中添加了一个 Grid(6 列,2 行)和 12 个 Button 控件。 Button 的 Tag 属性设置为其索引,即 1 到 12。所有按钮都附加到同一个事件处理程序 Button_Click,它具有以下简单主体:

    SetValue(ActiveLayerProperty, CInt(DirectCast(sender, Button).Tag))

  3. 在使用 UserControl 的窗口中,我有以下 XAML:

    <local:LayerSelector ActiveLayer="{Binding ActiveDrawing.ActiveLayer}" />

这里是PropertyChangedCallBack 处理程序:

Sub(sender As DependencyObject, e As DependencyPropertyChangedEventArgs)
  Dim Ctl = DirectCast(sender, LayerSelector)
  Dim WH = New SolidColorBrush(System.Windows.Media.Colors.White)
  For i = 0 To 11
    DirectCast(Ctl.FindName("btn" + i.ToString()), Button).Background = WH
  Next

  DirectCast(Ctl.FindName("btn" + e.NewValue.ToString()), Button).Background = New SolidColorBrush(System.Windows.Media.Colors.SkyBlue)
End Sub

问题

上述设置似乎不会更改我的 VM 的 ActiveLayer 属性。 Button Background 和 UserControl 的 ActiveLayer 属性似乎已更新。我做错了什么?

【问题讨论】:

    标签: wpf vb.net xaml user-controls dependency-properties


    【解决方案1】:

    您还没有为您的UserControl 设置DataContext,这是正确的,但是在这种情况下绑定到依赖属性略有不同。您需要直接绑定到UserControl 元素。

    您可以使用RelativeSource 绑定,如下所示:

    ActiveLayer="{Binding ActiveDrawing.ActiveLayer, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=UserControl}}"
    

    或者,提供您的 UserControlx:Name 并使用以下内容:

    ActiveLayer="{Binding ActiveDrawing.ActiveLayer, ElementName=yourUserControlName}"
    

    【讨论】:

    • 我没想到其中任何一个会起作用,但我试了一下,发现它们确实不起作用。为什么要在 UserControl 上设置 ActiveDrawing.ActiveLayer?我的 UserControl 没有任何此类属性。 ActiveDrawing.ActiveLayer 是我的 Window 的 DataContext 的一个属性。
    【解决方案2】:

    为按钮创建一个辅助 ViewModel,并设置并具有一个布尔属性 (IsActive)。

    在主视图模型中创建视图模型集合,并将每个按钮上的 DataContext 设置为集合中不同的索引视图模型。

    单击按钮时,您可以将单击按钮的 IsActive 属性设置为 true,将所有其他按钮设置为 False。 将每个按钮上的 BackgroundColor 绑定到 IsActive 属性,并使用 IValueConverter 将布尔值转换为背景颜色。

    为此,您需要在按钮 ViewModel 上实现 INotifyPropertyChanged。

    【讨论】:

      猜你喜欢
      • 2012-05-23
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      • 1970-01-01
      • 2012-10-08
      • 1970-01-01
      • 2016-04-30
      • 1970-01-01
      相关资源
      最近更新 更多