0

我有一个属性,根据它的状态(比如 A 和 B),我要么显示动画的用户控件,要么显示图像。

现在,如果属性发生变化,我想再次触发数据模板选择器。在搜索时,我发现在 WPF 中我可以使用 DataTemplate.Trigger 但它在 WP 中不可用。

所以,我的问题是

  • 他们是触发数据模板选择器的一种方式,因此当属性从状态 A 更改为 B 时,会选择适当的用户控件。如果是,那么请举例说明如何实现它。

另外,由于只有两种状态,如果认为我可以使用Converter来折叠visibility。对于基本的 if else 情况,我需要编写两个转换器。(我可以仅使用一个转换器以某种方式做到这一点吗?)这是确切的情况。

如果状态 == A :

选择 userControl_A

否则:选择 userControl_B

还,

  • 动画用户控件在折叠状态时会影响性能吗?

编辑- 刚刚意识到,我可以使用参数对象来编写一个转换器。

4

1 回答 1

3

您可以像这里描述的那样实现 DataTemplateSelector 。
我使用它并且效果很好。

编辑:
如果您需要在属性更改时更新 DataTemplate,您应该在 TemplateSelector 中订阅数据对象的 PropertyChanged 事件并再次执行 SelectTemplate 方法。

这是代码示例:

public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
    City itemAux = item as City;

    // Subscribe to the PropertyChanged event
    itemAux.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(itemAux_PropertyChanged);

    return GetTemplate(itemAux, container);
}

private DataTemplate GetTemplate(City itemAux, DependencyObject container)
{
    if (itemAux != null)
    {
        if (itemAux.Country == "Brazil")
            return BrazilTemplate;
        if (itemAux.Country == "USA")
            return UsaTemplate;
        if (itemAux.Country == "England")
            return EnglandTemplate;
    }

    return base.SelectTemplate(itemAux, container);
}

void itemAux_PropertyChanged(object sender, System.ComponentModel.PropertyChangedEventArgs e)
{
    // A property has changed, we need to reevaluate the template
    this.ContentTemplate = GetTemplate(sender as City, this);
}
于 2012-11-20T07:44:17.080 回答