ListView基于绑定值的不同控件

时间:2012-06-26 02:23:41

标签: wpf mvvm

我有一个显示链接按钮的ListView。我只需要链接按钮来显示'FileAddress'字符串是否有值。它应该显示一个带有Title的简单TextBlock。

<GridViewColumn.CellTemplate>
    <DataTemplate>
        <Button Style="{StaticResource LinkButton}" Height="23" Content="{Binding Path=Title}" />
    </DataTemplate>
</GridViewColumn.CellTemplate>

任何想法都会受到赞赏。

TIA。

2 个答案:

答案 0 :(得分:2)

我认为“gridview”是wpf的一个简单组件。执行此类更改有点笨拙。

您可以采用三种不同的方法:

1)使用GridViewColumn.CellTemplateSelector(http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselector
虽然我不喜欢=(

2)创建一个行为符合要求的UserControl。
看似合适而且比较容易

3)通过触发器更改按钮样式:

         <Button.Style>
            <Style TargetType="Button">
                <Style.Triggers>
                    <Trigger Property="Content" Value="{x:Null}">
                        <!-- Changes -->
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Button.Style>

             <Style TargetType="Button">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="Button">
                            <Grid>
                                <!-- Template -->
                            </Grid>
                            <ControlTemplate.Triggers>
                                <Trigger Property="Content" Value="{x:Null}">
                                    <!-- Changes -->
                                </Trigger>
                            </ControlTemplate.Triggers>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>

使用触发器时存在一些限制,有时你最终必须为按钮创建一个新模板,如果你知道搞乱xaml相对简单易行。

示例(我在这里有一个按钮,我正在改变他的形象):

 <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Button}">
                <Grid Width="{TemplateBinding Width}" Height="{TemplateBinding Height}">
                    <Image x:Name="imgBackground" Source="{StaticResource UpArrowImageNormal}" Stretch="None"/>
                </Grid>
                <ControlTemplate.Triggers>
                    <Trigger Property="IsPressed" Value="True">
                        <Setter TargetName="imgBackground"
                                Property="Source" Value="{StaticResource UpArrowImageIsPressed}"/>
                    </Trigger>
                    <Trigger Property="IsEnabled" Value="False">
                        <Setter TargetName="imgBackground" Property="Source" Value="{StaticResource UpArrowImageDisabled}"/>
                    </Trigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

答案 1 :(得分:0)

您可以使用以下转换器

[ValueConversion(typeof(Object), typeof(Visibility))]
public class NullVisibilityConv : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        if (value == null) return Visibility.Collapsed;
        else return Visibility.Visible;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return value;
    }

}

然后,您可以使用以下xaml

绑定到控件
<GridViewColumn.CellTemplate>
    <DataTemplate>
        <Button Style="{StaticResource LinkButton}" Height="23" Content="{Binding Path=Title}"
                Visibility="{Binding FileAddress, Converter={StaticResource NullToVisConverter}}"/>
    </DataTemplate>
</GridViewColumn.CellTemplate>

您还需要将转换器声明为xaml

中的某个资源
<converters:NullVisibilityConv x:Key="NullToVisConverter" />

这种方法的一个优点是,一旦在代码中声明了转换器,就可以在其他绑定上重新使用它而无需添加触发器或任何其他复杂代码,只需在可见性绑定上使用该转换器