首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >绑定属性到DataTemplate

绑定属性到DataTemplate
EN

Stack Overflow用户
提问于 2018-04-20 09:39:09
回答 2查看 383关注 0票数 0

我使用的是一个DataTemplate,它在ResourceDictionary文件中。

代码语言:javascript
复制
<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中,并使用如下模板:

代码语言:javascript
复制
<ContentControl ContentTemplate="{StaticResource AlertWarningMessage}" Grid.Row="2" Margin="0,2,0,0" DataContext="{Binding AlertSummary, UpdateSourceTrigger=PropertyChanged}" />

在我的VM中,我使用了一个具有两个属性的类:

代码语言:javascript
复制
    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作为我的类:

代码语言:javascript
复制
    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

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

代码语言:javascript
复制
    Public Sub ShowAlert()
        Me.AlertSummary.Message = "Test"
        Me.AlertSummary.Visibility = Visibility.Visible
        'Me.StartTimerAlert()
        RaisePropertyChanged("AlertSummary")
    End Sub

但这不管用。有两个问题:

  • 在开始时,当Visibility设置为Collapsed时,Border是可见的。
  • 当我更改Message属性时,它不会在视觉上得到更新。

我认为我的Binding有问题,但我不知道在哪里。我尝试过不同的东西,但总有这样的问题。此外,我还将该属性直接绑定在TextBlock中,位于ContentControlBinding工作查找中。

你知不知道?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-20 13:36:02

您应该将数据模板更改为:

代码语言:javascript
复制
 <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)

代码语言:javascript
复制
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;
            }
        }
    }
}

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

票数 1
EN

Stack Overflow用户

发布于 2018-04-20 10:08:39

我不熟悉VB,但是消息需要RaisePropertyChanged

可见性通常也是绑定的,这也是RaisePropertyChanged --然后使用BooleanToVisibilityConverter。

确保您的属性是公共的-有私有支持变量和RaisePropertyChanged。

代码语言:javascript
复制
    private bool _isSomethingVisibile;
    public bool IsSomethingVisibile
    {
        get { return _isSomethingVisibile; }
        set
        {
            _isSomethingVisibile = value;
            RaisePropertyChanged();
        }
    }

您不需要在绑定前加上隐含的"DataContext“。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49938625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档