我正在使用带有Model-View-ViewModel模式的WPF.因此,我的代码隐藏文件(.xaml.cs)都是空的,除了调用InitializeComponent的构造函数.因此,对于每个.xaml文件,我都有一个匹配的,无用的.xaml.cs文件.
我发誓我读到某个地方,如果文件后面的代码是空的,除了构造函数,有一种方法可以从项目中删除该文件.在搜索网络后,似乎适当的方法是使用'x:Subclass'属性:
<UserControl
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:toolkit="http://schemas.microsoft.com/wpf/2008/toolkit"
x:Class="MyNamespace.MyClass"
x:Subclass="UserControl"
d:DesignWidth="700" d:DesignHeight="500">
Run Code Online (Sandbox Code Playgroud)
这将在生成的.g.cs文件中执行以下操作:
似乎很完美.实际上,如果你在构建中仍然有.xaml.cs文件,它会因为缺少部分而不再编译 - 所以我认为这必须是正确的.但是,如果我从构建中删除多余的文件并运行,则控件不会正确初始化(它是空白的).我认为这是因为没有调用InitializeComponent().我看到InitializeComponent不是虚拟的,所以基类似乎没有办法调用它(没有使用反射).
我错过了什么吗?
谢谢!
埃里克
我正在使用新的System.Xml.Linq来创建HTML文档(是的,我知道HtmlDocument,但更喜欢XDocument/XElement类).我在插入 (或任何其他HTML实体)时遇到问题.我已经尝试过了:
只是直接放入文本不起作用,因为&转换为int&.
new XElement("h1", "Text to keep together.");
我尝试使用以下内容在原始XML中进行解析,但是barfs出现此错误:
XElement.Parse("文字保持在一起.");
- >引用未声明的实体'nbsp'
尝试编号三如下所示.如果我保存到文件中,只有一个空格, 就会丢失.
var X = new XDocument(new XElement("Name", KeepTogether("Hi Mom!")));
private static XNode KeepTogether(string p)`
{
return XElement.Parse("<xml>" + p.Replace(" ", " ") + "</xml>").FirstNode;
}
Run Code Online (Sandbox Code Playgroud)
我找不到一种方法只是将原始文本推送过去而不会被转义.我错过了一些明显的东西吗
我正在使用新的.NET 3.0 DataContractSerializer.我有Nullable < >和List < >对象我要序列化.例:
[DataContract(Namespace = "")]
class Test
{
public static void Go()
{
Test test = new Test();
var dcs = new DataContractSerializer(typeof(Test));
dcs.WriteObject(new StreamWriter("test.xml").BaseStream, test);
}
[DataMember]
public Nullable<int> NullableNumber = null;
[DataMember]
public int Number = 5;
[DataMember]
public List<int> Numbers = new List<int>();
}
Run Code Online (Sandbox Code Playgroud)
当.NET序列化空列表或空列表时,它将nil(对于Nullable)和空(对于列表)元素放入XML中.上面的例子生成:
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<NullableNumber i:nil="true"/>
<Number>5</Number>
<Numbers xmlns:a="http://schemas.microsoft.com/2003/10/Serialization/Arrays"/>
</Test>
Run Code Online (Sandbox Code Playgroud)
由于我没有时间描述的原因,我想消除多余的NullableNumber和Numbers元素,如下所示:
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<Number>5</Number>
</Test>
Run Code Online (Sandbox Code Playgroud)
实际上,上面的文件反序列化了串行器就好了.
谢谢你的帮助!
我想在类上实现IXmlSerializable,只覆盖ReadXml或WriteXml,但不能同时覆盖两者.如果我没有在这个类上实现IXMLSerializable,XMLSerializer会自动序列化所有成员.我希望该默认行为适用于未覆盖的案例.但是,由于IXmlSerializable是一个接口,而不是基类,我不知道该怎么做.
另外,在一种情况下,我需要执行默认行为,并在完成时添加一些额外的代码.所以,我想覆盖并回调'基础'类行为.同样,如果有一个基类,这将是微不足道的,但由于这是一个接口,因此不是那么微不足道.
谢谢!
为了更好地控制序列化,我将一个类从[DataContract]转换为[Serializable],实现了GetObjectData和特殊的反序列化构造函数.当我这样做时,现在发出的XML具有应用于所有元素的类型信息.我不想要这些多余的信息,我想知道如何通知序列化程序不输出它.
以下是使用[DataContract]的示例代码:
[DataContract(Namespace = "")]
class Test
{
public Test() { }
[DataMember]
public Nullable<int> NullableNumber = 7;
[DataMember]
public int Number = 5;
public static void Go()
{
var test = new Test();
var dcs = new DataContractSerializer(typeof(Test));
using (var s = new StreamWriter("test.xml"))
{
dcs.WriteObject(s.BaseStream, test);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这将输出以下XML(请注意Nullable Number和Number上没有类型信息 - 这是所需的输出):
<Test xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
<NullableNumber>7</NullableNumber>
<Number>5</Number>
</Test>
Run Code Online (Sandbox Code Playgroud)
如果我修改上面的代码如下(添加[Serializable],:ISerializable和两个序列化方法):
[Serializable]
class Test : ISerializable
{
public Test() { }
public Nullable<int> NullableNumber = 7;
public int Number = …Run Code Online (Sandbox Code Playgroud) 给定此类具有隐式转换运算符:
public class MyDateTime
{
public static implicit operator MyDateTime(System.Int64 encoded)
{
return new MyDateTime(encoded);
}
public MyDateTime(System.Int64 encoded)
{
_encoded = encoded;
}
System.Int64 _encoded;
}
Run Code Online (Sandbox Code Playgroud)
我现在可以做以下事情:
long a = 5;
MyDateTime b = a;
Run Code Online (Sandbox Code Playgroud)
但不是以下内容:
long f = 5;
object g = f;
MyDateTime h = g;
Run Code Online (Sandbox Code Playgroud)
这给出了编译时间:
无法将类型'object'隐式转换为'MyDateTime'.
我感觉合理.
现在我修改前面的例子如下:
long f = 5;
object g = f;
MyDateTime h = (MyDateTime)g;
Run Code Online (Sandbox Code Playgroud)
编译好了.现在我得到一个运行时InvalidCastException:
无法将"System.Int64"类型的对象强制转换为"MyDateTime"类型.
这告诉我C#隐式转换运算符仅在编译时应用,并且在.NET运行时试图将对象动态转换为另一种类型时不应用.
我的问题:
顺便说一句,完整的应用程序是我Delegate.DynamicInvoke()用来调用一个带MyDateTime参数的函数,而我传递给的参数的类型很DynamicInvoke长.
c# dynamic-cast type-conversion implicit-cast dynamic-invoke
问题:已注册的事件处理程序创建从事件到事件处理程序实例的引用.如果该实例未能注销事件处理程序(通过Dispose,可能),那么垃圾收集器将不会释放实例内存.
例:
class Foo
{
public event Action AnEvent;
public void DoEvent()
{
if (AnEvent != null)
AnEvent();
}
}
class Bar
{
public Bar(Foo l)
{
l.AnEvent += l_AnEvent;
}
void l_AnEvent()
{
}
}
Run Code Online (Sandbox Code Playgroud)
如果我实例化一个Foo,并将其传递给一个新的Bar构造函数,然后放开Bar对象,由于AnEvent注册,垃圾收集器不会释放它.
我认为这是一个内存泄漏,看起来就像我的旧C++时代.当然,我可以使Bar IDisposable,在Dispose()方法中取消注册事件,并确保在它的实例上调用Dispose(),但为什么我必须这样做?
我首先质疑为什么事件是通过强引用来实现的?为什么不使用弱引用?事件用于抽象地通知对象另一个对象的更改.在我看来,如果事件处理程序的实例不再使用(即,没有对该对象的非事件引用),那么它注册的任何事件都应该自动取消注册.我错过了什么?
我看过WeakEventManager.哇,多么痛苦.它不仅使用起来非常困难,而且其文档也不充分(请参阅http://msdn.microsoft.com/en-us/library/system.windows.weakeventmanager.aspx - 注意到"对继承者的说明"部分,有6个模糊的子弹).
我在各个地方看过其他讨论,但我觉得我无法使用.我提出了一个基于WeakReference的简单解决方案,如此处所述.我的问题是:这是否不符合要求,复杂性显着降低?
要使用该解决方案,上面的代码修改如下:
class Foo
{
public WeakReferenceEvent AnEvent = new WeakReferenceEvent();
internal void DoEvent()
{
AnEvent.Invoke();
}
}
class Bar
{
public Bar(Foo l)
{
l.AnEvent += l_AnEvent;
}
void l_AnEvent()
{
}
}
Run Code Online (Sandbox Code Playgroud)
注意两件事:1.Foo类以两种方式修改:事件被WeakReferenceEvent实例替换,如下所示; 并且更改了事件的调用.2. …
在Linux中,如何设置TCP连接上允许的最大段大小?我需要为我没写的应用程序设置它(所以我不能用setsockopt它来做).我需要将此设置为网络堆栈中的mtu.
我有两个流共享相同的网络连接.一个周期性地发送小数据包,这需要绝对最小延迟.另一个发送大量数据 - 我正在使用SCP来模拟该链接.
我已设置流量控制(tc)以使最小延迟流量具有高优先级.但是,我遇到的问题是,从SCP下来的TCP数据包最终会出现64K字节的大小.是的,这些基于mtu被分成更小的数据包,但遗憾的是,在tc对数据包进行优先级排序之后.因此,我的低延迟数据包被卡在高达64K字节的SCP流量后面.
本文指出在Windows上您可以设置此值.
我可以在Linux上设置一些东西吗?我尝试过ip route和iptables,但这些在网络堆栈中应用得太低了.我需要在tc之前限制TCP数据包大小,因此它可以适当地优先处理高优先级数据包.
在模型中,我有:
public ObservableCollection<Item> Items { get; private set; }
Run Code Online (Sandbox Code Playgroud)
在ViewModel中,我有一个相应的ItemViewModel列表.我希望这个列表与模型列表双向绑定:
public ObservableCollection<ItemViewModel> ItemViewModels ...
Run Code Online (Sandbox Code Playgroud)
在XAML中,我将绑定(在本例中为TreeView)到ItemViewModels属性.
我的问题是,上面显示的ViewModel中的"..."是什么?我希望一行或两行代码绑定这两个ObservableCollections(提供为每个模型对象构造的ViewModel的类型).但是,我担心的是需要一堆代码来处理Items.CollectionChanged事件并通过根据需要构建ViewModel来手动更新ItemViewModels列表,以及相应的相反方法,它将根据对ItemViewModel的更改来更新Items集合.
谢谢!
埃里克
c# ×7
.net ×4
mvvm ×2
wpf ×2
xaml ×2
xml ×2
code-behind ×1
dynamic-cast ×1
events ×1
html ×1
linq ×1
linux ×1
memory-leaks ×1
qos ×1
serializable ×1
tcp ×1