绑定到自定义控件的问题

时间:2013-06-02 13:14:03

标签: c# wpf binding custom-controls

我创建了一个自定义控件但是在数据绑定方面存在一些奇怪的问题。该控件有一个名为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>

2 个答案:

答案 0 :(得分:1)

因此,您的控件会公开名为StatusBlockData的{​​{1}}类型的依赖项属性? Status包含要绑定样式的属性StatusBlockDataStatusText

您的样式的数据上下文不仅仅是一个自定义依赖项属性,而是整个控件。要引用StatusIcon,您必须首先引用依赖项属性。这会将您的样式中的绑定更改为StatusText

答案 1 :(得分:0)

恕我直言,它与模板绑定有关。既然如此,你说你写过自定义控件 试试这个,

例如

<TextBlockText="{TemplateBinding StatusText}"/>