整个“故事”只能在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。
答案 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.Empty
或null
的其他内容。然后检查被调用方法中strConnectionString
的值,然后返回null
。 ItemsSource将获得null
并且不会抛出任何异常。
您GetKalender
方法的建议更改:
if (String.IsNullOrEmpty(strConnectionString))
return null;