gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 18:19:32 24 4
gpt4 key购买 nike

整个“故事”只能够在 XAML 中配置所有内容。我正在尝试将参数(来 self 的 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>

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

<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 的绑定(bind)中将 DinamicResource 更改为 StaticResource。

最佳答案

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

 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;

关于c# - 标记扩展的奇怪行为。它在设计模式下不起作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38546097/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com