绑定到自定义控件的问题
本文关键字:问题 自定义控件 绑定 | 更新日期: 2023-09-27 18:16:23
我创建了一个自定义控件,但是在数据绑定方面有一些奇怪的问题。控件有一个名为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>
所以你的控件暴露了StatusBlockData
类型的依赖属性称为Status
?StatusBlockData
包含属性StatusText
和StatusIcon
,你想绑定你的风格?
样式的数据上下文不仅仅是一个自定义依赖属性,而是整个控件。为了引用StatusText
,您必须首先引用依赖属性。这将更改样式中的绑定为Text="{Binding Status.StatusText}"
。
IMHO,这与模板绑定有关。因为,你说你已经写了一个自定义控件。试试这个,
。
<TextBlockText="{TemplateBinding StatusText}"/>