views:

50

answers:

2

how can i change a button template dinamiclly

i have a combobox where by changing his selected value i want to change a button template this is what i have been trying to do :

<Grid x:Name="LayoutRoot">

    <ComboBox Name="GroupBoxHeaderComboBox" ItemsSource="{Binding Path=collection}" 
    DisplayMemberPath="Key" Height="52" Margin="211.5,60,230.5,0" VerticalAlignment="Top" SelectedIndex="1"/>

    <Button Content="Button" HorizontalAlignment="Left" Height="102" Margin="47.5,0,0,91"
     VerticalAlignment="Bottom" Width="132" Template="{DynamicResource ButtonControlTemplate2}"/>
    <Button Content="Button" HorizontalAlignment="Right" Height="112.5" Margin="0,0,27.5,85"
     VerticalAlignment="Bottom" Width="153" Template="{DynamicResource ButtonControlTemplate1}"/>
     <Button Content="Button" Height="102" Margin="239.5,0,252.5,13.5"
     VerticalAlignment="Bottom" Template="{Binding ElementName=GroupBoxHeaderComboBox, Path=SelectedItem.Value}"/>
</Grid>

and here the templates associted

    <Window.Resources>
    <ControlTemplate x:Key="ButtonControlTemplate1" TargetType="{x:Type Button}">
        <Grid>
            <Rectangle Fill="#FF2D2D7A" Margin="7.5,9.5,8.5,11" Stroke="Black" RadiusX="45" RadiusY="45" StrokeThickness="6"/>
        </Grid>
    </ControlTemplate>
    <ControlTemplate x:Key="ButtonControlTemplate2" TargetType="{x:Type Button}">
        <Grid>
            <ed:RegularPolygon Fill="#FFE7F9C9" Height="Auto" InnerRadius="0.47211" Margin="20.5,16,15.5,8" PointCount="5" Stretch="Fill" Stroke="Black" StrokeThickness="6" Width="Auto"/>
        </Grid>
    </ControlTemplate>
</Window.Resources>

and the code behind :

public partial class MainWindow : Window
{
    public Dictionary<string, string> collection
    {
        get;
        private set;
    }

    public MainWindow()
    {
        this.InitializeComponent();
        DataContext = this;
        collection = new Dictionary<string, string>() 
        {
            { "DynamicResource ButtonControlTemplate2", "{DynamicResource ButtonControlTemplate2}"},
            { "DynamicResource ButtonControlTemplate1", "{DynamicResource ButtonControlTemplate2}"},

        };
    // Insert code required on object creation below this point.
    }
}

is there another genric way to acomplish it ?... i want that most of the code would b xmal. EDIT:

is there a point to do it using a style ' let's say i want more then one object to act otherwise is therea point to change the style and to do it all frim there

+1  A: 
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            DataContext = this;
        }

        public Dictionary<string, ControlTemplate> collection
        {
            get
            {
                Dictionary<string, ControlTemplate> controlTemplates = new Dictionary<string, ControlTemplate>();
                controlTemplates.Add("ButtonControlTemplate1", FindResource("ButtonControlTemplate1") as ControlTemplate);
                controlTemplates.Add("ButtonControlTemplate2", FindResource("ButtonControlTemplate2") as ControlTemplate);
                return controlTemplates;
            }
        } 
    }
Wallstreet Programmer
what a great one thanks .
yoav.str
@Wallstreet i seem to have a problem i am putting FindResource inside the VM and i have no acsses to hom can you please help with it ?
yoav.str
Control templates and other resources belong in the view and your VM should not reference your view if following MVVM. I would store the keys in the VM ("ButtonControlTemplate1", "ButtonControlTemplate2") and use some code behind in the view class to map the keys to a ControlTemplatwe using FindResource. If you want to store the ControlTemplates in the VM, then either create them in the VM using code behind or have the view populate the ControlTemplate collection in the VM in its Loaded handler.
Wallstreet Programmer
+1  A: 

You can use a data trigger and do it all in xaml.

This uses a tree but the concept is the same

<Window x:Class="WpfBindingTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfBindingTest"
Title="Window3" Height="300" Width="300"  Name="win3" >
<Window.Resources>
    <XmlDataProvider x:Key="treeData" XPath="*">
        <x:XData>
            <Items Name="Items" xmlns="">
                <Item1/>
                <Item2>
                    <Item22/>
                    <Item12/>
                    <Item13>
                        <Item131/>
                        <Item131/>
                    </Item13>
                </Item2>
            </Items>
        </x:XData>
    </XmlDataProvider>
    <HierarchicalDataTemplate ItemsSource="{Binding XPath=child::*}"

x:Key="template">

from here.

(I just googled to get an example faster)

nportelli