3

整个“故事”只是为了能够在 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 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 进行了编辑。

4

1 回答 1

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.Emptyor的其他内容。null然后检查被strConnectionString调用方法中的值并简单地返回null。ItemsSource 将获取null并且不会抛出异常。

建议更改您的GetKalender方法:

if (String.IsNullOrEmpty(strConnectionString))
        return null;
于 2016-07-24T07:52:22.900 回答