WPF Button内容基于DataContext设置

时间:2011-01-17 10:20:07

标签: c# wpf

我正在使用WPF和MVVM模式,我有一个简单的视图,它包含一个Button,它应该显示一个或另一个东西,具体取决于DataContext的属性(viewmodel) 我已经使用datatriggers和datatemplates来尝试使这个工作,但由于某种原因,绑定没有评估(或我做错了)。

    <Button x:Class="EpicNavalBattle.View.PositionView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 

        >
    <Button.Resources>
        <DataTemplate x:Key="Hidden">
            <Label Content="Hidden"></Label>
        </DataTemplate>
        <DataTemplate x:Key="Shown">
            <Label Content="{Binding Path=Content.ContentName}" />
        </DataTemplate>



    </Button.Resources>
    <Button.Style>
        <Style TargetType="{x:Type Button}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding Revealed}" Value="False">
                    <Setter Property="ContentTemplate" Value="{DynamicResource Hidden}"></Setter>

                </DataTrigger>
                <DataTrigger Binding="{Binding Revealed}" Value="True">
                    <Setter Property="ContentTemplate" Value="{DynamicResource Shown}"></Setter>

                </DataTrigger>
            </Style.Triggers>
        </Style>

    </Button.Style>


</Button>

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

1 个答案:

答案 0 :(得分:4)

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

ContentControls例如Button,将其内容设置为DataContext的{​​{1}}。因此,当您绑定到DataTemplate时,实际上是绑定到Button的内容。

您可以通过两种方式解决它:

DataContext

或者将值设置为触发器中的内容:

{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type Button}}, Path=DataContext.Content.ContentName}

使用隐藏的btw,最后一个解决方案也会更容易,所以你可以扔掉这些模板:

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

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

            <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>