【问题标题】:Issues with binding to custom control绑定到自定义控件的问题
【发布时间】:2013-06-02 13:14:02
【问题描述】:

我创建了一个自定义控件,但在数据绑定方面遇到了一些奇怪的问题。该控件有一个名为Status 的DependencyProperty,它需要StatusBlockData 类型的对象。如果我创建一个StatusBlockData 对象,直接将它用作我的窗口的DataContext 并将我的控件与Status={Binding .} 绑定,绑定就可以了。

但是当我在视图public StatusBlockData Status { get; set; } 中创建对象作为属性时,将视图用作窗口的DataContext 并将我的控件绑定更改为Status="{Binding Status}",它不再起作用。

我很困惑。在这两种情况下,我都绑定到 StatusBlockData 对象,对吧?这是一些代码。我认为控件的样式并不重要,因为在第一种情况下绑定可以正常工作。

这是我的观点(Header 属性仅用于测试):

public ViewMainWindow()
    {
        Status = new StatusBlockData(5);
        Status.SetStatus("does not work", StatusIcon.Information);
        Header = "Binding works";
    }

    public string Header { get; set; }
    public StatusBlockData Status { get; set; }
}

使用视图不起作用:

public MainWindow()
{
    InitializeComponent();

    ViewMainWindow view = new ViewMainWindow();
    this.DataContext = view;
    view.Status.SetStatus("this is not displayed", StatusIcon.Success);
}

XAML 看起来像这样(同样 - 标头仅用于测试):

<GrassoftUtils:StatusBlock Status="{Binding Status}" Background="Red" Width="159"/>
<TextBlock Text="{Binding Header}" HorizontalAlignment="Left" Margin="168,101,0,0" VerticalAlignment="Top" />

但没有视图,它可以工作:

public MainWindow()
{
    InitializeComponent();

    StatusBlockData Status = new StatusBlockData(5);
    this.DataContext = Status;
    Status.SetStatus("this works", StatusIcon.Information);
}

绑定(当然文本块是空的):

<GrassoftUtils:StatusBlock Status="{Binding .}" Background="Red" Width="159"/>
<TextBlock Text="{Binding Header}" HorizontalAlignment="Left" Margin="168,101,0,0" VerticalAlignment="Top" />

我刚刚意识到的另一件奇怪的事情是:Status="{Binding .}" 的绑定始终有效,无论 Binding 后面是什么词。我预计它会失败。这是问题的一部分吗?

为了省事,这是控件的样式:

<Style TargetType="{x:Type Controls:StatusBlock}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Controls:StatusBlock}">
                <Grid Height="24" Background="{TemplateBinding Background}" Visibility="{Binding Path=StatusVisible, Converter={StaticResource VisibilityConverter}}">
                    <Image  Height="24" Width="24" Source="{Binding StatusIcon, Converter={StaticResource StatusIconConverter}}" HorizontalAlignment="Left" VerticalAlignment="Top"/>
                    <TextBlock Margin="28,0,0,0" Text="{Binding StatusText}" HorizontalAlignment="Left" VerticalAlignment="Center"   />
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

【问题讨论】:

  • 迟早你必须开始实施 INotifyPropertyChanged。
  • 我在整个项目中都这样做了。您在此处看到的仅用于测试。这就是我创建 header 属性的原因:以确保我没有这个问题。 StatusBlockData 类完全实现了 INotifyPropertyChanged

标签: c# wpf binding custom-controls


【解决方案1】:

所以您的控件公开了一个名为StatusStatusBlockData 类型的依赖属性?并且StatusBlockData 包含属性StatusTextStatusIcon,你想绑定你的样式?

样式的数据上下文不仅仅是一个自定义依赖属性,而是整个控件。为了引用StatusText,您必须首先引用依赖属性。这会将您样式中的绑定更改为Text="{Binding Status.StatusText}"

【讨论】:

  • 哇,这很有意义。知道这一点,我的问题听起来有些愚蠢。非常感谢您的帮助!
【解决方案2】:

恕我直言,它与模板绑定有关。因为,你说你写了一个自定义控件。
试试这个,

例如。

<TextBlockText="{TemplateBinding StatusText}"/>

【讨论】:

  • 在设计时出现错误:无法识别或无法访问成员“StatusText”。
  • 那是例如,你可以为状态应用 TemplateBinding
  • 对不起,我不太清楚你的意思。你说的是风格,对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 2020-05-29
  • 2017-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多