Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/256.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# 基于DataContext设置的WPF按钮内容_C#_Wpf - Fatal编程技术网

C# 基于DataContext设置的WPF按钮内容

C# 基于DataContext设置的WPF按钮内容,c#,wpf,C#,Wpf,我正在使用WPF和MVVM模式,我有一个简单的视图,它由一个按钮组成,根据DataContext(viewmodel)的属性显示一个或另一个内容 我使用了datatriggers和datatemplates来尝试实现这一点,但由于某些原因,绑定没有进行评估(或者我做了一些错误的事情) 为了避免混淆:Content是ViewModel(继承的datacontext)的一个属性,基本上是Model类,ContentName是Model类的一个属性。 对整个datatemplate进行了评估,因为

我正在使用WPF和MVVM模式,我有一个简单的视图,它由一个按钮组成,根据DataContext(viewmodel)的属性显示一个或另一个内容 我使用了datatriggers和datatemplates来尝试实现这一点,但由于某些原因,绑定没有进行评估(或者我做了一些错误的事情)


为了避免混淆:Content是ViewModel(继承的datacontext)的一个属性,基本上是Model类,ContentName是Model类的一个属性。 对整个datatemplate进行了评估,因为为了证明这一点,我更改了文本的Content=“Binding…”内容,它实际上显示了一个带有指定标签的按钮。 现在,我看到的只是没有文本的按钮(小,最小尺寸)
非常感谢您的帮助(不仅是关于如何解决这个问题,还有关于我在这里做错了什么)。谢谢

我测试了您的代码示例,问题是:

content控件
例如按钮,为
DataTemplate
将其内容设置为
DataContext
。因此,当您绑定到
DataContext
时,实际上是绑定到按钮的内容

您可以通过两种方式解决此问题:

{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=DataContext.Content.ContentName}
或者将该值设置为触发器中的内容:

<Setter Property="Content" Value="{Binding Content.ContentName}"></Setter>

最后一个解决方案也会更容易隐藏btw,因此您可以扔掉这些模板:

            <Button.Style>
                <Style TargetType="{x:Type Button}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding Revealed}" Value="True">
                                <Setter Property="Content" Value="{Binding Content.ContentName}"></Setter>
                        </DataTrigger>
                        <DataTrigger Binding="{Binding Revealed}" Value="False">
                                <Setter Property="Content" Value="Hidden"></Setter>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </Button.Style>

额外奖励:超短解决方案:

<Style TargetType="{x:Type Button}">
    <Setter Property="Content" Value="Hidden" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Revealed}" Value="True">
            <Setter Property="Content" Value="{Binding Content.ContentName}" />
        </DataTrigger>
    </Style.Triggers>
</Style>


抱歉,它没有解决问题。另外,你也不会说你是基于什么来发布答案:)好吧!这就是我所说的:)。我将使用第一种方法,不是因为它比第二种方法更纠结,而是因为现在我只是想让它工作,但实际上我需要在按钮内部创建一些东西(一个包含一些内容的图像)。但是非常感谢您提供了详细的答案,以及关于为什么在额外奖金简短解决方案案例中,如果您通过
设置
内容属性的初始值(“隐藏”)而不是在样式内部(如上面的代码中)设置
内容属性的初始值(“隐藏”),那么它将不起作用的主要解释!(样式的触发器不会更改内容)将被警告
<Style TargetType="{x:Type Button}">
    <Setter Property="Content" Value="Hidden" />
    <Style.Triggers>
        <DataTrigger Binding="{Binding Revealed}" Value="True">
            <Setter Property="Content" Value="{Binding Content.ContentName}" />
        </DataTrigger>
    </Style.Triggers>
</Style>