XAML WPF控制模板

时间:2016-01-25 16:09:52

标签: c# wpf xaml templates

这是

WPF Control's Nested property's data binding

以某种方式解决了?

...

我怎么能:

  1. 声明一个源自Control
  2. 的模板化控件
  3. 拥有属于中间层的属性
  4. 从XAML
  5. 设置中级课程的属性

    我有这段代码:

    <cars:2016Model
        Engine.Power = "MOREMOREWARPSPEED"
    >
    
    public class 2016Model : Control
    {
    public 2016Model()
    {
    if (Date == 2016)
    Engine = new 2016 Engine
    }
    
    public Engine { get; set; }
    
    public class Engine 
    {
        public virtual Double Power
        get
        {
            return 0;
        }
    }
    
    public class 2016Engine : Engine
     {
        public override Power
        {
            return 1000KWH;
        }
    }
    
    public class 2015Engine : Engine
    {
        public override Power
        {
            return 350HP;
        }
    }
    

    我想换掉中级班。

    我想换掉模板,并对模型和引擎的当前版本拥有不同的视图。

    我想对此进行模板化,但我无法看到如何从Xaml设置可交换类的属性。

1 个答案:

答案 0 :(得分:1)

我不完全确定我明白你想做什么,但我怀疑。

首先,您的代码由于各种原因而无法编译 - 除此之外,您无法使用数字启动标识符。但这是一个狡辩 - 假设这些模型对象:

public class Car2016Model : Control
{
    public Engine Engine { get; set; }
}

public class Engine
{
    public virtual double Power => 0;
}

public class Engine2016 : Engine
{
    public override double Power => 1000;
}

public class Engine2015 : Engine
 {
    public override double Power => 350;
}

然后,您可以使用不同的引擎在XAML中声明汽车,如下所示:

<cars:Car2016Model>
    <cars:Car2016Model.Engine>
        <cars:Engine2015 />
    </cars:Car2016Model.Engine>
</cars:Car2016Model>
<cars:Car2016Model>
    <cars:Car2016Model.Engine>
        <cars:Engine2016 />
    </cars:Car2016Model.Engine>
</cars:Car2016Model>

当然,如果您还希望显示有用的内容,则需要为Cars2016Model控件提供控件模板:

<Grid.Resources>
    <ResourceDictionary>
        <ControlTemplate TargetType="cars:Car2016Model" x:Key="Template">
            <Grid Background="Cyan">
                <TextBox Text="{Binding Engine.Power, Mode=OneTime}" />
            </Grid>
        </ControlTemplate>
    </ResourceDictionary>
</Grid.Resources>

从控件中引用模板:

<cars:Car2016Model Template="{StaticResource Template}">
    <cars:Car2016Model.Engine>
        <cars:Engine2015 />
    </cars:Car2016Model.Engine>
</cars:Car2016Model>

希望这就是你所要求的。

相关问题