【问题标题】:Is it possible to cancel a WPF Binding to a Control.Template property using Binding.DoNothing?是否可以使用 Binding.DoNothing 取消对 Control.Template 属性的 WPF 绑定?
【发布时间】:2011-04-14 17:56:04
【问题描述】:

当我的模型中的属性值为真时,我想轻松地为控件使用只读模板。为此,我创建了一个 IValueConverter,它在源值为 true 时返回它的参数(在本例中为模板),在为 false 时返回 Binding.DoNothing。

当我将它应用到我的控件时,我得到了一个没有模板的控件。

【问题讨论】:

  • 我尝试在转换器中简单地返回 Binding.DoNothing,所以我知道问题不存在。

标签: c# wpf templates binding


【解决方案1】:

听起来您可以使用 DataTemplateSelector 而不是 IValueConverter,类似于:

//namespace MyProject.ViewUtilities
public class MyDataTemplateSelector: DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var localFrameworkElement = container as FrameworkElement;
        var modelObject = item as ModelObject;

        if(modelObject.BoolProperty){
            return Template(localFrameworkElement, "WhenTrueDataTemplate");
        }
        else
        {
            return Template(localFrameworkElement, "WhenFalseDataTemplate");
        }
    }


    private DataTemplate Template(FrameworkElement localFrameworkElement, string resourceKeyString)
    {
        return localFrameworkElement.FindResource(resourceKeyString) as DataTemplate;
    }
}

使用类似的东西:

<ComboBox xmlns:mpvu="MyProject.ViewUtilities"
    ItemsSource="{Binding Path=MyModelObjectCollection}">
    <ComboBox.ItemTemplateSelector>
        <mpvu:MyDataTemplateSelector/>
    </ComboBox.ItemTemplateSelector>
</ComboBox>

如果这不是您想要的,也许可以在您的帖子中添加一些示例代码。

【讨论】:

  • 我实际上已经使用类似于您的方法(我使用了行为)解决了它,但我很好奇为什么 DoNothing 不起作用......
猜你喜欢
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 2012-04-24
  • 2013-01-30
  • 1970-01-01
  • 2018-05-10
  • 1970-01-01
相关资源
最近更新 更多