【发布时间】:2017-05-11 09:10:03
【问题描述】:
我想绑定一些控件的边距,比如说一个按钮:
<Window.Resources>
<local:MarginConverter x:Key="marginConverter1"/>
</Window.Resources>
<Grid HorizontalAlignment="Left" VerticalAlignment="Top"
Margin="{Binding MyThickness,
Converter={StaticResource marginConverter1}}">
<Button>Button1</Button>
</Grid>
根据参考。这里:SO: Binding a part of the margin,我创建了一个MarginConverter 类和一个MyDataContext 类来实现INotifyPropertyChanged 接口(见下文),但Button1 保持在左上角位置(好像它的边距为0) .
Public Class MyDataContext
Implements INotifyPropertyChanged
Private _myThickness As Thickness = New Thickness(20, 10, 20, 0)
Public Event PropertyChanged As PropertyChangedEventHandler _
Implements INotifyPropertyChanged.PropertyChanged
Private Sub OnPropertyChanged(propertyName As String)
RaiseEvent PropertyChanged(Me, New PropertyChangedEventArgs(propertyName))
End Sub
Public Property MyThickness As Thickness
Get
Return _myThickness
End Get
Set(value As Thickness)
_myThickness = value
OnPropertyChanged("MyThickness")
End Set
End Property
End Class
以及背后的代码:
Dim myDataContext1 As New MyDataContext()
Private Sub Window1_Initialized(sender As Object, e As EventArgs) Handles Me.Initialized
myDataContext1.MyThickness = New Thickness(20, 150, 20, 0)
End Sub
请帮助我澄清我的误解,即使是您的基本知识或清晰的解释也将不胜感激!
P/S: 我绑定上边距的目的是当用户执行某些特定任务时,窗口顶部会出现一个 25 高的边框,因此所有现有控件都必须向下。 因此,如果您有其他方法,请在此处分享。谢谢。
【问题讨论】:
-
我不太擅长 VB,而且您没有提供
marginConverter1代码,但看起来您正在尝试在绑定上做一些事情,这已经是Thickness对于绑定来说绰绰有余。Margin的值为Thickness,因此您需要提供与Thickness类型的数据或任何其他类型的转换器的绑定。 PS,如果您按原样使用链接中的代码,这将不起作用,因为他们提供了带有绑定的double,并使用转换器将其转换为Thickness,而您已经提供了Thickness。 -
嗨,Shakra,感谢您的回复。是的,我在给定的 SO 链接中使用了 MarginConverter 类的 VB 代码。我会根据你的建议来解决的!
-
在绑定中尝试不使用
Converter的代码 -
亲爱的@Shakra,为了只有上边距值,我删除了 xaml 中的
MarginConverter,但按钮仍然留在左上角。我还尝试添加一个名为MyTopMargin的新属性为Integer以再次使用转换器,但它也不起作用。我认为问题出在其他地方......你能弄清楚吗?
标签: c# wpf vb.net binding margin