如何根据WPF中的数据类型更改控件

时间:2013-02-01 04:45:52

标签: wpf datatemplate

我必须使用WCF服务从DB中检索值,并使用ID-Type值填充名为“Type”的下拉列表(使用observable collection来绑定它)。

应该有另一个由数据模板/控制模板控制的控件,它将根据所选的类型显示。例如如果选择了TextBox类型,则TextBox应显示一些默认值。

InputType文本框 - 这将用于在DB中创建新类型。使用“保存”按钮可以保存值。

删除按钮 - 这应该从数据库中删除所选的类型。

我完成了DataBase Stuff和所有,但我应该如何根据XAML中的数据类型更改控制?

1 个答案:

答案 0 :(得分:2)

您可以使用一般ContentControl,其样式将选择(通过触发器)包含适当控件类型的不同ControlTemplates。

这种方法也可以稍加修改,以使用DataTemplates而不是ControlTemplates(可以说是更好的方法)。不要设置Template属性(这是一个ControlTemplate),而是设置ContentTemplate属性(这是一个DataTemplate)并用你想要的控件填充每个DataTemplate。

<Window x:Class="ControlTypeBasedOnComboBox.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Grid>
    <Grid.RowDefinitions>
        <RowDefinition/>
        <RowDefinition/>
    </Grid.RowDefinitions>
    <ComboBox Grid.Row="0"
              ItemsSource="{Binding Path=ControlTypes}"
              x:Name="ControlTypeComboBox"/>
    <ContentControl Grid.Row="1">
        <ContentControl.Style>
            <Style TargetType="ContentControl">
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=ControlTypeComboBox, Path=SelectedItem}" Value="TextBox">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="ContentControl">
                                    <TextBox/>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=ControlTypeComboBox, Path=SelectedItem}" Value="CheckBox">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="ContentControl">
                                    <CheckBox/>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding ElementName=ControlTypeComboBox, Path=SelectedItem}" Value="Button">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="ContentControl">
                                    <Button/>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </ContentControl.Style>
    </ContentControl>
</Grid>

代码隐藏:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = new ViewModel();
    }
}

视图模型:

public class ViewModel
{
    ObservableCollection<string> controlTypes;
    public ViewModel()
    {
        controlTypes = new ObservableCollection<string>() { "TextBox", "CheckBox", "Button" };
    }

    public ObservableCollection<string> ControlTypes
    {
        get { return controlTypes; }
    }
}    

对于保存/删除按钮,您还可以根据ComboBox的SelectedItem将Command属性绑定到View Model上的不同ICommand对象。我不知道你需要什么样的功能,所以我不知道这是否必要/适当。

希望有所帮助!