Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 绑定到自定义控件的问题_C#_Wpf_Binding_Custom Controls - Fatal编程技术网

C# 绑定到自定义控件的问题

C# 绑定到自定义控件的问题,c#,wpf,binding,custom-controls,C#,Wpf,Binding,Custom Controls,我创建了一个自定义控件,但在数据绑定方面有一些奇怪的问题。控件具有名为Status的DependencyProperty,它需要类型为StatusBlockData的对象。如果我创建了一个StatusBlockData对象,则直接将其用作窗口的DataContext,并使用Status={Binding.}绑定来绑定我的控件 但是,当我在视图public StatusBlockData Status{get;set;}中创建对象as属性时,将该视图用作窗口的DataContext,并将控件的绑定

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

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

我非常困惑。在这两种情况下,我都绑定到一个
StatusBlockData
对象,对吗?下面是一些代码。我假设控件的样式并不重要,因为在第一种情况下绑定工作正常

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

使用视图不起作用:

public MainWindow()
{
    InitializeComponent();

    ViewMainWindow view = new ViewMainWindow();
    this.DataContext = view;
    view.Status.SetStatus("this is not displayed", StatusIcon.Success);
}
XAML看起来像这样(同样-标题仅用于测试):

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


嗯,这和模板绑定有关。从那时起,您说您已经编写了一个自定义控件。
试试这个

例如


那么您的控件公开了一个类型为
StatusBlockData
的依赖属性,称为
Status
?和
StatusBlockData
包含要绑定样式的属性
StatusText
StatusIcon


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

,在设计时出现错误:成员“StatusText”无法识别或无法访问。例如,您是否可以为statusry应用TemplateBinding,我不太确定您的意思。你刚才说的是样式,对吗?迟早你必须开始实现INotifyPropertyChanged。我在整个项目中都是这么做的。你在这里看到的只是为了测试。这就是我创建header属性的原因:确保我没有这个问题。
StatusBlockData
类完全实现了InotifyPropertyChangedWaw,这很有意义。知道这一点,我的问题听起来有点愚蠢。非常感谢你的帮助!
public MainWindow()
{
    InitializeComponent();

    ViewMainWindow view = new ViewMainWindow();
    this.DataContext = view;
    view.Status.SetStatus("this is not displayed", StatusIcon.Success);
}
<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" />
<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>
<TextBlockText="{TemplateBinding StatusText}"/>