1

我有 3 个用户控件

控制 1
控制 2
控制 3

我有一个包含 ItemsControl 的堆栈面板

<UserControl.Resources>
  <DataTemplate x:Key="Template1">  
      <my:UserControl1 Height="117"/>              
 </DataTemplate>    
 <DataTemplate x:Key="Template2">
  <my:UserControl3 Height="117"/>            
 </DataTemplate>    
 <DataTemplate x:Key="Template3">
   <my:UserControl3 Height="117"/>            
  </DataTemplate>    
</UserControl.Resources>  

<StackPanel Name="stackPanel3" Orientation="Vertical" VerticalAlignment="Bottom" Width="Auto">
  <ItemsControl ItemsSource="{Binding BlocksForMonth.Blocks}" ItemTemplate="{StaticResource Template1}">      
  </ItemsControl>
</StackPanel>

BlocksForMonths.Blocks 是视图模型的列表。Blocks 类有一个名为 ClipType 的属性。如果clipType 为1,我想使用Template1。如果是 2,我想使用模板 2。如果是 3,我想使用模板 3

这些模板包含不同的用户控件

我怎样才能通过绑定来做到这一点?

我考虑了 1 个带有 3 个控件的模板,但我不知道如何绑定可见性?

在这个 XAML 中,我绑定到一个列表而不是单个项目

保罗

4

1 回答 1

2

我会将 3 个控件放在同一个模板中,并使用 Visibility 来显示正确的一个。我要做的是构建一个 IValueConverter 来转换决定值(您的情况是 ClipType)并将其与 ConverterParameter 进行比较。如果它们相等,则返回 Visibility.Visible,否则返回 Visibility.Collapsed。

<UserControl.Resources>
    <my:ClipTypeToVisibilityConverter x:Key="converter"/>
    <DataTemplate x:Key="Template">
        <StackPanel>  
            <my:UserControl1 Height="117" Visibility={Binding ClipType, Converter={StaticResource converter}, ConverterParameter=1} />              
            <my:UserControl2 Height="117" Visibility={Binding ClipType, Converter={StaticResource converter}, ConverterParameter=2} />            
            <my:UserControl3 Height="117" Visibility={Binding ClipType, Converter={StaticResource converter}, ConverterParameter=3} />            
        </StackPanel>
    </DataTemplate>    
</UserControl.Resources>  

<StackPanel Name="stackPanel3" Orientation="Vertical" VerticalAlignment="Bottom" Width="Auto">
      <ItemsControl ItemsSource="{Binding BlocksForMonth.Blocks}" ItemTemplate="{StaticResource Template}">      
      </ItemsControl>
</StackPanel>

此示例假定 ClipType 属性位于正在显示的列表中的每个项目视图模型上。

这是一个 C# 示例转换器。

    public class ClipTypeToVisibilityConverter: IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
                var clipType = value.ToString();

                if (clipType == (string)parameter))
                    return Visibility.Visible;

                return Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

对不起,一切都是空气代码。但我想你明白了。

于 2012-08-18T21:16:25.797 回答