将属性绑定到 DataTemplate
Binding properties to DataTemplate
我正在使用 DataTemplate
,它位于 ResourceDictionary
文件中。
<DataTemplate x:Key="AlertWarningMessage">
<Grid>
<Border Visibility="{Binding DataContext.Visibility}" Background="{StaticResource ResourceKey=AlertWarningMessageBackground}" HorizontalAlignment="Stretch" Height="30">
<WrapPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="WARNING !" FontWeight="Bold" Foreground="{StaticResource ResourceKey=AlertWarningMessageForeground}" FontSize="13"/>
<TextBlock Text="{Binding DataContext.Message}" Foreground="{StaticResource ResourceKey=AlertWarningMessageForeground}" Margin="5,0,0,0"/>
</WrapPanel>
</Border>
</Grid>
</DataTemplate>
我将这个词典合并到我的 UserControl
中,我正在使用这个模板:
<ContentControl ContentTemplate="{StaticResource AlertWarningMessage}" Grid.Row="2" Margin="0,2,0,0" DataContext="{Binding AlertSummary, UpdateSourceTrigger=PropertyChanged}" />
在我的 VM 中,我使用的 class 具有 2 个属性:
Public Class AlertInfos
Public Property Visibility As Visibility
Public Property Message As String
Public Sub New(p_visibility As Visibility, p_msg As String)
Me.Visibility = p_visibility
Me.Message = p_msg
End Sub
End Class
属性 VM 作为我的 class :
Private _alertSummary As AlertInfos
Public Property AlertSummary() As AlertInfos
Get
Return _alertSummary
End Get
Set(ByVal value As AlertInfos)
_alertSummary = value
RaisePropertyChanged("AlertSummary")
End Set
End Property
此对象的属性设置为 Collapsed
和 String.Empty
接下来,我更改此对象的值,如下所示:
Public Sub ShowAlert()
Me.AlertSummary.Message = "Test"
Me.AlertSummary.Visibility = Visibility.Visible
'Me.StartTimerAlert()
RaisePropertyChanged("AlertSummary")
End Sub
但它不起作用。有2个问题:
- 开始时,当
Visibility
设置为Collapsed
时,Border
可见。
- 当我更改
Message
属性 时,它没有在视觉上更新。
我认为我的 Binding
有问题,但我不知道在哪里。我尝试了不同的东西,但总是存在这些问题。
此外,我已将 属性 直接绑定到 ContentControl
下方的 TextBlock
和 Binding
工作查找。
你有什么想法吗?
我不熟悉 VB 但 Message 需要 RaisePropertyChanged
可见性通常也被绑定到 bools 上,它也被 RaisePropertyChanged - 然后使用 BooleanToVisibilityConverter
确保您的属性 public - 具有私有支持变量和 RaisePropertyChanged。
private bool _isSomethingVisibile;
public bool IsSomethingVisibile
{
get { return _isSomethingVisibile; }
set
{
_isSomethingVisibile = value;
RaisePropertyChanged();
}
}
您不需要在绑定前加上隐含的 "DataContext"。
您应该将数据模板更改为:
<DataTemplate x:Key="AlertWarningMessage">
<Grid>
<Border Visibility="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=DataContext.Visibility}" Background="AliceBlue" HorizontalAlignment="Stretch" Height="30">
<WrapPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="WARNING !" FontWeight="Bold" Foreground="Red" FontSize="13"/>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=DataContext.Message}" Foreground="Red" Margin="5,0,0,0"/>
</WrapPanel>
</Border>
</Grid>
</DataTemplate>
还有你的 AlertInfos(它在 C# 上,所以尝试将它翻译成 VB)
public class AlertInfos
{
private string message;
public string Message
{
get
{
return this.message;
}
set
{
if (this.message != value)
{
this.message = value;
}
}
}
private Visibility visibility;
public Visibility Visibility
{
get
{
return this.visibility;
}
set
{
if (this.visibility != value)
{
this.visibility = value;
}
}
}
}
它应该能用,至少它在我的电脑上能用
我正在使用 DataTemplate
,它位于 ResourceDictionary
文件中。
<DataTemplate x:Key="AlertWarningMessage">
<Grid>
<Border Visibility="{Binding DataContext.Visibility}" Background="{StaticResource ResourceKey=AlertWarningMessageBackground}" HorizontalAlignment="Stretch" Height="30">
<WrapPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="WARNING !" FontWeight="Bold" Foreground="{StaticResource ResourceKey=AlertWarningMessageForeground}" FontSize="13"/>
<TextBlock Text="{Binding DataContext.Message}" Foreground="{StaticResource ResourceKey=AlertWarningMessageForeground}" Margin="5,0,0,0"/>
</WrapPanel>
</Border>
</Grid>
</DataTemplate>
我将这个词典合并到我的 UserControl
中,我正在使用这个模板:
<ContentControl ContentTemplate="{StaticResource AlertWarningMessage}" Grid.Row="2" Margin="0,2,0,0" DataContext="{Binding AlertSummary, UpdateSourceTrigger=PropertyChanged}" />
在我的 VM 中,我使用的 class 具有 2 个属性:
Public Class AlertInfos
Public Property Visibility As Visibility
Public Property Message As String
Public Sub New(p_visibility As Visibility, p_msg As String)
Me.Visibility = p_visibility
Me.Message = p_msg
End Sub
End Class
属性 VM 作为我的 class :
Private _alertSummary As AlertInfos
Public Property AlertSummary() As AlertInfos
Get
Return _alertSummary
End Get
Set(ByVal value As AlertInfos)
_alertSummary = value
RaisePropertyChanged("AlertSummary")
End Set
End Property
此对象的属性设置为 Collapsed
和 String.Empty
接下来,我更改此对象的值,如下所示:
Public Sub ShowAlert()
Me.AlertSummary.Message = "Test"
Me.AlertSummary.Visibility = Visibility.Visible
'Me.StartTimerAlert()
RaisePropertyChanged("AlertSummary")
End Sub
但它不起作用。有2个问题:
- 开始时,当
Visibility
设置为Collapsed
时,Border
可见。 - 当我更改
Message
属性 时,它没有在视觉上更新。
我认为我的 Binding
有问题,但我不知道在哪里。我尝试了不同的东西,但总是存在这些问题。
此外,我已将 属性 直接绑定到 ContentControl
下方的 TextBlock
和 Binding
工作查找。
你有什么想法吗?
我不熟悉 VB 但 Message 需要 RaisePropertyChanged
可见性通常也被绑定到 bools 上,它也被 RaisePropertyChanged - 然后使用 BooleanToVisibilityConverter
确保您的属性 public - 具有私有支持变量和 RaisePropertyChanged。
private bool _isSomethingVisibile;
public bool IsSomethingVisibile
{
get { return _isSomethingVisibile; }
set
{
_isSomethingVisibile = value;
RaisePropertyChanged();
}
}
您不需要在绑定前加上隐含的 "DataContext"。
您应该将数据模板更改为:
<DataTemplate x:Key="AlertWarningMessage">
<Grid>
<Border Visibility="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=DataContext.Visibility}" Background="AliceBlue" HorizontalAlignment="Stretch" Height="30">
<WrapPanel Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
<TextBlock Text="WARNING !" FontWeight="Bold" Foreground="Red" FontSize="13"/>
<TextBlock Text="{Binding RelativeSource={RelativeSource AncestorType=ContentControl}, Path=DataContext.Message}" Foreground="Red" Margin="5,0,0,0"/>
</WrapPanel>
</Border>
</Grid>
</DataTemplate>
还有你的 AlertInfos(它在 C# 上,所以尝试将它翻译成 VB)
public class AlertInfos
{
private string message;
public string Message
{
get
{
return this.message;
}
set
{
if (this.message != value)
{
this.message = value;
}
}
}
private Visibility visibility;
public Visibility Visibility
{
get
{
return this.visibility;
}
set
{
if (this.visibility != value)
{
this.visibility = value;
}
}
}
}
它应该能用,至少它在我的电脑上能用