将值转换器绑定到对象或类型

时间:2012-07-17 18:29:15

标签: c# wpf xaml ivalueconverter

例如,我有一个类似这样的视图模型:


public class MyViewModel
{
    public ObservableCollection { get; set; }
}

public abstract class Person { }

public class Employee : Person { }

public class Boss : Person { }

根据人的类型,我不想对ListItemTemplate进行一些更改。我有一个像这样的值转换器:


public object Convert(object value, Type targetType, object parameter, string language)
{
       if (value == null) return Visibility.Collapsed;

      return value is Boss ? Visibility.Visible : Visibility.Collapsed;
}

如何将Visibilty属性绑定到转换器?

我做过的事情:

<Border Visibility="{Binding Path=self, Converter={StaticResource BossVisibilityConverter}}">

<Border Visibility="{Binding Path=this, Converter={StaticResource BossVisibilityConverter}}">

1 个答案:

答案 0 :(得分:1)

如果将DataContext设置为ViewModel实例,则只需尝试以下操作:

<Border Visibility="{Binding Converter={StaticResource BossVisibilityConverter}}">

此外,您可能希望查看 DataTemplateSelector

public class PersonDataTemplateSelector: DataTemplateSelector
{

    public DataTemplate BossTemplate { get; set; }
    public DataTemplate EmployeeTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        DataTemplate selectedTemplate = null;

        if (item is Boss)
        {
            selectedTemplate = BossTemplate;
        }
        else
        {
            selectedTemplate = EmployeeTemplate;
        }

        return selectedTemplate;
    }
}
xaml中的

<controls:PersonDataTemplateSelector x:Key="personDataTemplateSelector"
                                       BossTemplate="{StaticResource ResourceKey=BossTemplate}" 
                                       EmployeeTemplate="{StaticResource ResourceKey=EmployeeTemplate}" />

<DataTemplate x:Key="BossTemplate">
   ... Template here
</DataTemplate>

<DataTemplate x:Key="EmployeeTemplate">
   ... Template here
</DataTemplate>

然后,您可以使用personDataTemplateSelector作为ListView或其他ItemsControl中ItemTemplateSelector的值。

<ContentPresenter Content="{Binding}" 
                  ContentTemplateSelector="{StaticResource ResourceKey=personDataTemplateSelector}" />