将属性绑定到 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

此对象的属性设置为 CollapsedString.Empty

接下来,我更改此对象的值,如下所示:

    Public Sub ShowAlert()
        Me.AlertSummary.Message = "Test"
        Me.AlertSummary.Visibility = Visibility.Visible
        'Me.StartTimerAlert()
        RaisePropertyChanged("AlertSummary")
    End Sub

但它不起作用。有2个问题:

我认为我的 Binding 有问题,但我不知道在哪里。我尝试了不同的东西,但总是存在这些问题。 此外,我已将 属性 直接绑定到 ContentControl 下方的 TextBlockBinding 工作查找。

你有什么想法吗?

我不熟悉 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;
            }
        }
    }
}

它应该能用,至少它在我的电脑上能用