我正在使用没有表达式混合,只使用vs2010中的XAML编辑器.除此之外,我越来越多地看到了对设计时数据绑定的需求.对于简单的情况,该FallbackValue属性非常好用(Textboxes和TextBlocks等).但特别是在处理ItemsControl等时,确实需要在设计器中显示样本数据,以便您可以调整和调整控件和数据模板,而无需运行可执行文件.
我知道ObjectDataProvider允许绑定到一个类型,因此可以提供可视化的设计时数据,但是有一些杂耍,允许绑定真实的运行时数据,而不通过加载设计时加载浪费资源, dummied数据和运行时绑定.
我真正想要的是能够拥有,比如"John","Paul","George"和"Ringo"在XAML设计师中作为我的可设置项目出现ItemsControl,但是当应用程序显示真实数据时运行.
我也知道Blend允许一些花哨的属性来定义WPF在运行时条件下有效忽略的设计时绑定数据.
所以我的问题是:
1.我如何利用visual studio XAML设计器中的集合和非平凡数据的设计时绑定,然后平滑地交换到运行时绑定?
2.其他人如何解决这个设计时与运行时数据问题?就我而言,我不能很容易地为两者使用相同的数据(例如,数据库查询可以使用相同的数据).
3.他们可以用于数据集成XAML设计的表达混合替代品吗?(我知道有一些替代方案,但我特别想要一些我可以使用的东西,看看绑定的样本数据等?)
我编写了一组通过已发布的接口属性相互链接的组件.它们已注册并安装在设计包中.
使用已发布的接口属性在Delphi中并不常见,因此,不出所料,似乎效果不佳.
当组件驻留在同一表单上时,它工作正常,但不同表单上的组件之间的接口属性链接会导致问题.
与指向另一个表单上的组件的对象链接不同,IDE似乎无法识别接口链接.我的意思最好用一个例子来描述,当你在IDE中打开2个表单,并在它们之间有组件之间的链接,然后尝试切换到表单视图时,文本(Alt + F12)将导致IDE正确地抱怨:
Module 'UnitXXX.pas' has open descendents or linked modules. Cannot close.
但是如果属性是一个接口,那么这不会发生,而是发生的事情是链接被切断(当你使用Notification机制清除引用时这是最好的情况,否则你会留下无效的指针)
另一个问题,可能是同一个错误的结果是,当您在IDE中打开项目时,表单将重新打开的顺序是未定义的,因此IDE可以尝试打开包含具有到组件的接口链接的组件的表单另一种形式,但其他形式尚未重新创建.因此,这有效地导致AV或切断链接.
早在90年代,我使用时Datasets,Datasources我记得表格之间的链接消失的类似问题,所以这有点类似.
作为临时解决方法,我添加了重复的已发布属性,对于每个Interface属性,我添加了另一个声明为的属性TComponent.这使得Delphi意识到表单之间存在联系,但至少可以说这是一个丑陋的解决方法.
所以我想知道我能做些什么来解决这个问题?这是一个IDE错误,可能无法直接修复,但也许我可以覆盖某些内容或以其他方式挂接到流机制,以更有效地解决此错误.
我从未如此深入到流机制,但我怀疑Fixup机制应该处理这个问题.有一个,csFixups TComponentState所以我希望可以解决方法.
编辑:使用D2007.
更新:
上传到http://www.filedropper.com/fixupbugproject2的新更新的可重现示例
添加后property ComponentReference: TComponent,可以轻松比较和跟踪界面与组件流.
我将问题缩小到汇编级别,这有点超出我的深度.
在单位的程序GlobalFixupReferences中,classes它调用:
(GetOrdProp(FInstance, FPropInfo) <> 0)
最终执行:
function TInterfacedComponent.GetInterfaceReference: IInterface;
begin
// uncomment the code bellow to avoid exception
{ if (csLoading in ComponentState) and (FInterfaceReference = nil) then
// leave result unassigned …Run Code Online (Sandbox Code Playgroud) 我有一个自定义用户控件,上面有一个文本框,我想在自定义控件之外公开基线(文本框中的文本)snapline.我知道您创建了一个设计器(继承自ControlDesigner)并覆盖SnapLines以访问snapline,但我想知道如何获取我自定义用户控件公开的控件的文本基线.
.net user-controls design-time windows-forms-designer winforms
我的数据绑定版本号如下所示:
<Window <!-- ... --> DataContext="{Binding RelativeSource={RelativeSource Self}}">
<Grid>
<TextBlock>
Version is:
<Run Text="{Binding Version, Mode=OneWay}"></Run>
and advancing...
</TextBlock>
</Grid>
</Window>
Run Code Online (Sandbox Code Playgroud)
它在运行期间正在运行.
如何在Visual Studio 2012的XAML编辑器中在设计时看到它?我只看到:
Version is: and advancing...
Run Code Online (Sandbox Code Playgroud)
代替:
Version is: 5.2.2 and advancing...
Run Code Online (Sandbox Code Playgroud)
下面的Jure的答案有效,但我最终使用了虚拟视图模型静态代码技术,这对我来说更好,因为数据是真实视图模型类型的模拟:
d:DataContext="{Binding Source={StaticResource DesignViewModel}}" ...
Run Code Online (Sandbox Code Playgroud) 我在我的用户控件的构造函数中有一个方法调用,它做了一些在设计时无法工作的东西(连接到数据库),当我尝试将该控件添加到GUI设计器时,Visual Studio就被挽救了.
当然,我可以将代码分解为一个单独的方法,但我不喜欢每次使用该对象时我都需要记住执行某个对象函数必不可少的方法的想法(这就是构造函数的作用)对于!).
是否有类似预处理器符号的东西,我可以标记我的代码,以便Visual Studio不会尝试在设计时执行该代码?
我有一个类(控件),实现了ICustomTypeDescriptor,它在设计时和PropertyGrid运行时都用于自定义.我需要在设计时公开不同的属性(标准控件属性width,height等等),并在运行时,在我的程序中使用PropertyGrid来更改该控件的其他属性.
我的代码是这样的:
class MyControl : UserControl, ICustomTypeDescriptor
{
//Some code..
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
return GetProperties();
}
public PropertyDescriptorCollection GetProperties()
{
//I need to do something like this:
if (designTime)
{ //Expose standart controls properties
return TypeDescriptor.GetProperties(this, true);
}
else
{
//Forming a custom property descriptor collection
PropertyDescriptorCollection pdc = new PropertyDescriptorCollection(null);
//Some code..
return pdc;
}
}
}
Run Code Online (Sandbox Code Playgroud)
C#中的设计时标志是否有模拟?使用条件编译可能更好吗?
我正在开发WPF MarkupExtension并在设计时遇到错误.使用以前版本的Visual Studio 2010,可以启动Visual Studio 2010的第二个实例并附加到已运行实例的进程,设置断点并调试设计时行为.
但是在Visual Studio 2012中,我也可以附加到另一个Visual Studio 2012的进程,但是在第二个实例中没有加载符号,因此我无法像使用Visual Studio 2010那样调试设计时间.
如何运行此调试器?
我试过的事情:
wpf design-time markup-extensions visual-studio visual-studio-debugging
使用Windows 7和Visual Studio 2010,我正在编写一个C#自定义UserControl.我在代码视图中进行了数周的编码,最近当我尝试切换到设计模式时,Visual Studio被绞死,"没有回应".我可以等一个小时,但仍然没有任何反应.单击关闭按钮,它会显示"您是否要等待,关闭,重新启动并向Microsoft发送信息"对话框.
有没有办法(堆栈)跟踪设计者试图执行的代码?也许设计时跟踪消息或断点?
我有一个对象启动一个线程,打开一个文件,并等待来自其他类的输入.当它接收输入时,它会将其写入磁盘.基本上,它是一个线程安全的数据记录类...
这是奇怪的部分.当我在设计器(Visual Studio 2008)中打开一个使用该对象的表单时,将创建该文件.它显然是在设计时vhost进程下运行的......
奇怪的是我无法在另一个项目中重现这个问题.我不确定在设计器中执行的代码和没有执行的代码的规则是什么.例如,在Windows窗体构造函数中创建文件实际上并不是在设计时创建文件...
解释是什么?有参考吗?
有没有办法在设计时进行预编译反射?
我的意图是使用T4基于实现某些接口的类来吐出自定义代码.我知道我可以调用反射,但我希望T4脚本在编译之前吐出额外的代码,否则我需要编译代码两次,一次生成dll,两次让T4反映先前生成的dll并添加额外的脚手架.
有没有办法在设计时做反思?
有一个更好的方法吗?
design-time ×10
.net ×5
c# ×3
winforms ×3
wpf ×3
data-binding ×2
xaml ×2
delphi ×1
delphi-2007 ×1
designer ×1
ide ×1
interface ×1
reflection ×1
t4 ×1