标记扩展的奇怪行为。它在设计模式下不起作用吗?

时间:2016-07-23 20:22:39

标签: c# wpf xaml binding objectdataprovider

整个“故事”只能在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绑定中将DinamicResource更改为StaticResource。

1 个答案:

答案 0 :(得分:0)

如何检查您的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;