WPF привязать slider к шаблонам

как при изменении слайдера менять стиль ItemsControl?

<Window.Resources>
    <Style x:Key="tmp1" 
       TargetType="ItemsControl">

    <Style x:Key="tmp2" 
       TargetType="ItemsControl">

    <Style x:Key="tmp3" 
       TargetType="ItemsControl">

<Slider x:Name="tmpslider" Width="150" 
    SmallChange="1" 
    IsSnapToTickEnabled="True" 
    Maximum="2" 
    ValueChanged="Slider_ValueChanged"/>

<ItemsControl x:Name="lview"
    Style="{StaticResource tmp1}">

C#

styles = new List<Style>() { (Style)FindResource("tmp1"), (Style)FindResource("tmp2"), (Style)FindResource("tmp3") };
private void Slider_ValueChanged(object sender, RoutedPropertyChangedEventArgs<double> e)
{
    lview.Style = styles[(int)tmpslider.Value];
}

пока придумал только так. как сделать на чистом WPF?
UPD: хочу сделать смену видов как в Winddows - список, мелкие значки, крупные и т.д.


Ответы (1 шт):

Автор решения: axmed2004
<DataTemplate x:Key="dtmp1">
<DataTemplate x:Key="dtmp2">
<DataTemplate x:Key="dtmp3">

<ItemsPanelTemplate x:Key="pStack">
    <StackPanel/>
</ItemsPanelTemplate>
<ItemsPanelTemplate x:Key="pWrap">
    <WrapPanel/>
</ItemsPanelTemplate>

Вариант с триггерами

<ItemsControl>
    <ItemsControl.Style>
        <Style TargetType="ItemsControl">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=tmpslider, Path=Value}" Value="0">
                    <Setter Property="ItemTemplate" Value="{StaticResource dtmp1}"/>
                    <Setter Property="ItemsPanel" Value="{StaticResource pStack}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=tmpslider, Path=Value}" Value="1">
                    <Setter Property="ItemTemplate" Value="{StaticResource dtmp2}"/>
                    <Setter Property="ItemsPanel" Value="{StaticResource pWrap}"/>
                </DataTrigger>
                <DataTrigger Binding="{Binding ElementName=tmpslider, Path=Value}" Value="2">
                    <Setter Property="ItemTemplate" Value="{StaticResource dtmp3}"/>
                    <Setter Property="ItemsPanel" Value="{StaticResource pWrap}"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </ItemsControl.Style>
</ItemsControl>

Вариант с конвертером

public class sliderTotmpConverter : IValueConverter
{
    public DataTemplate dtmp_1 { get; set; }
    public DataTemplate dtmp_2 { get; set; }
    public DataTemplate dtmp_3 { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Dictionary<string, DataTemplate> dtmpDict=new Dictionary<string, DataTemplate>()
        {
                { "0", dtmp_1},
                { "1",dtmp_2 },
                { "2",dtmp_3}
        };
        return dtmpDict[value.ToString()];

    }    

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

public class sliderToItemsPanelConverter : IValueConverter
{
    public ItemsPanelTemplate p_Stack { get; set; }
    public ItemsPanelTemplate p_Wrap { get; set; }

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        Dictionary<string, ItemsPanelTemplate> d = new Dictionary<string, ItemsPanelTemplate>()
        {
            {"0" ,p_Stack },
            {"1", p_Wrap }
        };
        return value.ToString()=="0"?d["0"]:d["1"];
    }

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

<Window.Resources>
    <local:sliderToTmpConverter x:Key="sltotmp"
        dtmp_1="{StaticResource dtmp1}"
        dtmp_2="{StaticResource dtmp2}"
        dtmp_3="{StaticResource dtmp3}"
        />
    <local:sliderToItemsPanelConverter x:Key="sltoPanel"
        p_Stack="{StaticResource pStack}"
        p_Wrap="{StaticResource pWrap}"/>
</Window.Resources>
<ItemsControl>
    <ItemsControl.Style>
        <Setter Property="ItemTemplate" Value="{Binding ElementName=tmpslider, Path=Value, Converter={StaticResource sltotmp}}"/>
        <Setter Property="ItemsPanel" Value="{Binding ElementName=tmpslider, Path=Value, Converter={StaticResource sltoPanel}}"/>
    </ItemsControl.Style>
</ItemsControl>
→ Ссылка