【问题标题】:Strange behavior of markup extension. Does it not work in design mode?标记扩展的奇怪行为。它在设计模式下不起作用吗?
【发布时间】:2016-11-27 12:25:03
【问题描述】:

整个“故事”只是为了能够在 XAML 中配置所有内容。我正在尝试将参数(来自我的 Application 类的变量)传递给 ObjectDataProvider(ODP) 方法。这个想法是使用标记扩展。现在在运行时一切正常,扩展为 ODP 返回此参数。在设计时它不起作用。标记扩展在设计时不可用吗?有什么方法可以检查它们是否被称为到期设计时间?

扩展:

namespace ZApplication
{
    public class ZAppExtension : MarkupExtension
    {
        public ZAppExtension() { }
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            MessageBox.Show("ProvideValue called");
            return @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=TermineDB;Integrated Security=True;Persist Security Info=True";
        }
    }
}

XAML ObjectDataProvider:

   <ObjectDataProvider x:Key="objKalender"
                        MethodName="GetKalender"
                        ObjectType="{x:Type zzzDataLayer:TermineAPI}">

        <ObjectDataProvider.MethodParameters>
            <z:ZAppExtension></z:ZAppExtension>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>

在设计时不起作用的绑定:

<ListBox x:Name="listBox" Height="129" Margin="19,0,18,37" VerticalAlignment="Bottom"  
         ItemsSource="{Binding Mode=OneWay, Source={StaticResource objKalender}}" 
         DisplayMemberPath="Beschreibung"  SelectedValuePath="Id" 
         SelectedIndex="2"  SelectedValue="{Binding PrimaryCalendarId}" BorderThickness="1"/>

证明扩展有效:

   <TextBlock x:Name="textBlock1" HorizontalAlignment="Right" Margin="0,210,42,190" TextWrapping="Wrap" Text="{z:ZApp}" Width="247"/>

如果在设计时不允许/以某种方式禁用标记,那么将任何变量传递给 MethodParameter 的方法是什么?

任何帮助将不胜感激。

编辑以添加 GetKalender:

public static IEnumerable<Kalender> GetKalender(String strConnectionString=null)
{
    zEntityContext.zDataContext dc;
    if (String.IsNullOrEmpty(strConnectionString))
        dc = new zEntityContext.zDataContext();
    else
        dc = new zEntityContext.zDataContext(strConnectionString);

    return dc.Kalendere.Select(kalender => new Kalender(kalender, dc));
}

为在 ListBox 绑定中将 DinamResource 更改为 StaticResource 进行了编辑。

【问题讨论】:

    标签: c# wpf xaml binding objectdataprovider


    【解决方案1】:

    如何检查您的 MarkupExtension 是否在 Designer 模式下使用?

     public override object ProvideValue(IServiceProvider serviceProvider)
        {
           IProvideValueTarget ipvt = (IProvideValueTarget)serviceProvider.GetService(typeof(IProvideValueTarget));
           if (ipvt.TargetObject is DependencyObject && System.ComponentModel.DesignerProperties.GetIsInDesignMode((DependencyObject)ipvt.TargetObject) == true)
                    return "No designer mode please !";
    
            MessageBox.Show("ProvideValue called while running !");
            return @"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=TermineDB;Integrated Security=True;Persist Security Info=True";
        }
    

    如何克服使用 MarkupExtension 作为方法的参数?

    在上述方法中,在设计器模式下返回可能是 String.Emptynull 的其他内容。然后检查被调用方法中strConnectionString 的值并简单地返回null。 ItemsSource 会得到null,不会抛出异常。

    建议更改您的 GetKalender 方法:

    if (String.IsNullOrEmpty(strConnectionString))
            return null;
    

    【讨论】:

    • 谢谢。现在我知道如何检索非 UI 元素中的设计状态。直到主要问题 - 我仍然无法理解为什么这个绑定在设计时不起作用。 PS:编辑主题启动器 - 添加 GetKalender。
    • 是否有其他常规方法(不带扩展名)允许我将静态属性从某个对象作为参数传递给 ObjectDataProvider?我喜欢如何通过购买到桌面的扩展和可能性扩展来完成它 - 但前提是它可靠地工作:)
    • Anjum,谢谢你的提议。但是 exeption 想要我的问题 - 问题是在设计时没有调用扩展。如果设计模式中的某些东西是不好的解决方案(至少对我来说),可以通过到处检查来克服。此时我需要生成干净的 XAML 并允许在设计时查看一些数据。这个扩展(和 ODP 的参数)旨在根据我的配置显示不同的数据库连接。这与 App.config 和 consorts 无关。无论如何,奇怪的是这个扩展没有在设计时调用,而是在运行时调用。
    • 如果我不使用扩展名(和 GetKalenders 中的参数)一切正常。但为了基于 XAML 的设计,我必须这样做。
    • 并不是所有的东西都会在设计期间运行。扩展代码在设计时运行,为什么 ObjectDataProvider 方法会在设计时运行?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-09-21
    相关资源
    最近更新 更多