【问题标题】:XAML WPF Control TemplatesXAML WPF 控件模板
【发布时间】:2016-01-25 16:09:51
【问题描述】:

这是

WPF Control's Nested property's data binding

曾经以某种方式解决过吗?

...

我该怎么做:

  1. 声明一个从 Control 派生的模板化控件
  2. 有一个作为属性的中间层类
  3. 从 XAML 设置中级类的属性

我有这个代码:

<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 设置可交换类的属性。

【问题讨论】:

  • 我已经稍微整理了你的问题,但我仍然不太清楚意图。您是说要在 Xaml 中声明 2015Engine2016Engine 的实例但不知道该怎么做?你试过什么?
  • 不,我想在 2016Model 的特定版本中声明实例。在构造函数中。没关系,我可以为每个课程设置不同的课程。但是我不能为每个子模型设置不同的类。我需要从 XAML 设置引擎大小。
  • 你刚才所说的似乎没有意义:你想在构造函数中声明(我认为)Engine 的实例,你说这很好,但你说您不能为子模型设置不同的类(您刚刚暗示可以)。您能否尝试准确地描述您希望能够声明的对象配置以及您希望 Xaml 包含的内容?现在我无法解决这个问题。
  • @DanPuzey 我需要设置一个来自 XAML 的属性的对象的属性。
  • 你还是没有解释清楚。让我尝试一个不同的问题:您的问题是您的行 Engine.Power = "MOREMOREWARPSPEED" 导致错误吗?如果是这样:错误是什么?我问这个是因为在您发布的代码中,Powerread-only -并且还在派生类中使用无效语法声明(因此您发布的代码无法编译完全)。

标签: c# wpf xaml templates


【解决方案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>

希望这就是你要问的。

【讨论】:

  • 这是我正在研究的一种模式,但并不满意。我想为从 Control 派生的同一个 BASE 类使用几个不同的模板,例如 。因此,在这种情况下,我希望能够声明从这个基础派生的多个类,并且在构造函数中我将专门化引擎类型。但我希望模板可以在所有这些之间重用。
  • 我不希望控件的最终用户必须在 XAML 中指定引擎专业化。当我进入“
  • 你会看到问题编辑吗?你能回答老问题吗?
  • 我对旧问题进行了尝试,但不幸的是,我无法进行绑定。从linked blog post 看来,对于缺少继承上下文的类来说,这似乎无法完成。
  • 所以在那个例子中,如果我简单地说“nestedtestproperty = 'foo'”会起作用吗?是因为继承上下文吗?!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多