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