小编Qwe*_*tie的帖子

将多选ListBox与MVVM同步

我有一些数据的两个视图:一个列表视图(一个ListBox现在,但我一直意味着切换到ListView)和一个奇特的图形表示在地图上.在任一视图中,用户都可以单击对象,并且将在两个视图中选择该对象.Multiselect也是可能的,因此每个ViewModel实例都有自己的IsSelected属性.

目前我绑定ListBoxItem.IsSelectedViewModel.IsSelected,但是这只是工作,如果正常的ListBox不是虚拟化(见这里).不幸的是,禁用虚拟化会损害性能,而我的应用程序变得太慢了.

所以我必须再次启用虚拟化.为了保持ViewModel.IsSelected屏幕外项目的属性,我注意到ListBox并且ListView有一个SelectionChanged事件我可以(可能)用来将选择状态从传播ListBox/ListViewViewModel.

我的问题是,如何反向传播选择状态?该SelectedItems属性ListBox/ListView是只读的!假设用户单击图形表示中的项目,但它在列表中是屏幕外的.如果我只是设置,ViewModel.IsSelected那么ListBox/ListView将不知道新的选择,因此如果用户单击列表中的其他项目,它将无法取消选择该项目.我可以打电话ListBox.ScrollIntoViewViewModel,但有几个问题:

  • 在我的UI中,如果它们以图形方式位于相同的位置,实际上可以通过一次单击选择两个项目,尽管它们可能位于完全不同的位置ListBox/ListView.
  • 它打破了ViewModel的隔离(我的ViewModel完全没有意识到WPF,我想保持这种方式.)

那么,亲爱的WPF专家,有什么想法吗?

编辑:我最终切换到Infragistics控件并使用一个丑陋而缓慢的解决方案.关键是,我不再需要答案了.

.net wpf mvvm multi-select virtualizingstackpanel

18
推荐指数
1
解决办法
9766
查看次数

SignalR hub方法参数序列化

我需要SignalR开发人员的一些指导,这是调整HUB方法参数序列化的最佳方法.

我开始将我的项目从WCF轮询双工(Silverlight 5 - ASP.NET 4.5)迁移到SignalR(1.1.2).消息(数据契约)是基于接口的多态的.(与IMessage,MessageA:IMessage等一样 - 实际上存在由类实现的接口的层次结构,但它对于该问题并没有多大意义).(我知道多态对象不适合客户端,但客户端会将其作为JSON处理,并且只有在服务器端或客户端上才能映射到对象(如果它是.NET/Silverlight)

在集线器上我定义了这样的方法:

public void SendMessage(IMessage data) { .. }
Run Code Online (Sandbox Code Playgroud)

我创建了自定义JsonConverters并验证了可以使用Json.NET对消息进行序列化/反序列化.然后我用适当的设置替换了DependencyResolver中的JsonNetSerializer.同样在Silverlight客户端.到现在为止还挺好.

但是当我将消息从客户端发送到服务器(消息被正确地序列化为JSON - 在Fiddler中验证)时,服务器返回错误,该参数无法反序列化.在调试器的帮助下,我在SignalR中发现了一个错误(负责反序列化的JRawValue类在内部创建了自己的JsonSerializer实例,忽略了提供的一个).通过替换看起来很容易解决

var settings = new JsonSerializerSettings
{
    MaxDepth = 20
};
var serializer = JsonSerializer.Create(settings);
return serializer.Deserialize(jsonReader, type);
Run Code Online (Sandbox Code Playgroud)

var serializer = GlobalHost.DependencyResolver.Resolve<IJsonSerializer>();
return serializer.Parse(jsonReader, type);
Run Code Online (Sandbox Code Playgroud)

但我也发现在未来版本的SignalR中将删除IJsonSerializer接口.基本上,我需要从HUB方法获取原始JSON(或字节流),以便我可以自己反序列化它,或者通过指定转换器等来调整序列化器的可能性.

现在我最终用JObject参数类型定义了方法:

public void SendMessage(JObject data)
Run Code Online (Sandbox Code Playgroud)

然后使用手动反序列化数据

JObject.ToObject<IMessage>(JsonSerializer)
Run Code Online (Sandbox Code Playgroud)

方法.但我更喜欢自定义序列化程序并在hub方法上使用类型/接口.关于下一个SignalR设计的"正确方法"是什么?

我还发现有可能从我的代码发送回客户端原始JSON,即使SignalR再次序列化对象.我怎么能实现这个目标?

c# signalr signalr-hub

17
推荐指数
1
解决办法
2211
查看次数

那里有"功能大小分析器"吗?

在从事C++项目三年后,可执行文件已增长到4 MB.我想看看所有这些空间的去向.有没有一种工具可以报告最大的太空猪是什么?很高兴看到按类(类中的所有函数),模板(所有实例化)和库(多少属于C标准库和STL?exe中的每个库有多少?)的大小.

编辑:注意,我在Windows上使用Visual C++.

c++ size profiler function

14
推荐指数
2
解决办法
2106
查看次数

"兼容包"用于向后移植新的.NET Framework功能?

由于各种原因,我经常发现编写与.NET framework 2.0或3.5兼容或与.NET Compact Framework兼容的代码是可取的,但是新的.NET框架中有许多"小"特性是一个问题.在旧框架或Compact Framework中不可用.

例如,我发现扩展方法确实很有用,但编译器依赖System.Runtime.CompilerServices.ExtensionAttribute于此.您可以自己轻松定义此属性,然后在.NET Framework 2.0中使用扩展方法(在C#3.0+下).同样的,这是不是太硬手动定义小.NET 4种类型,如Tuple<T1,T2>Lazy<T>.顺便说一句,如果你想在.NET 2.0中使用LINQ,你可以使用LinqBridge.

现在假设你ExtensionAttribute公开,以便你编写的其他程序集可以使用它.一开始就没问题,但是如果你想使用也有同样想法的第三方库呢?您添加对该库的引用,现在您有名称冲突.哎呀.

我还注意到一些新的库只适用于.NET 4.0或3.5,即使它们只有很小的依赖关系,可以使用兼容包或LinqBridge来解决.

如果旧的.NET版本的"兼容包"在一个小DLL中定义了这些小功能,你可以证明包括在任何规模的项目中,这肯定会很好.这样的事情存在吗?

更新:从沉默来判断,我想没有这样的事情.如果有兴趣,我可能会自己创建这样一个OSS库.所以我的新问题是,如果你在为.NET 2,.NET 3.5,.NETCF或Silverlight编写,你会想念.NET 4的哪些功能(而不是像WCF/WPF这样的怪物)?我将开始列表......

  • ExtensionAttribute (不是在.NET 2中)
  • Func<...>Action<...>代表(不在.NET 2中)
  • LINQ到对象(不在.NET 2中)
  • Tuple<...> (不是在.NET 3.5中)
  • Lazy<T>Lazy<T,TMetadata>(不是在.NET 3.5中)
  • 表达式树(不在.NET 2中;在.NET 3.5中不完整)
  • 泛型方差(存在于.NET 2中,但无法从C#3和VB 9中访问)
  • Reflection.Emit (缺少.NETCF;不是一个小功能,但我非常想念它)

.net compatibility compact-framework .net-3.5 .net-2.0

14
推荐指数
1
解决办法
2103
查看次数

如何获得Visible属性的"真实"价值?

如果将Windows窗体控件的Visible属性设置为true,则如果隐藏任何控件的父窗口,该属性仍将返回false.有没有办法在隐藏父窗口的情况下获取控件的真实底层可见性标志?

.net visible winforms

11
推荐指数
1
解决办法
2946
查看次数

什么.NET字典支持"查找最近的键"操作?

我正在将一些C++代码转换为C#,并调用std :: map :: lower_bound(k)来查找映射中的键,该键的大小等于或大于k.但是,我没有看到任何方法与.NET的SortedDictionary做同样的事情.我怀疑我可以使用SortedList实现变通方法,但遗憾的是SortedList太慢(O(n)用于插入和删除键).我能做什么?

注意:我发现使用的解决方法利用了我的特定场景...具体来说,我的键是一个密集的整数,从0开始,所以我使用List <TValue>作为我的字典,列表索引作为密钥和搜索等于或大于k的密钥只能在几次循环迭代中完成.但是看到原来的问题得到解答仍然会很好.

.net dictionary key lower-bound

11
推荐指数
1
解决办法
5091
查看次数

WPF:在屏幕坐标和WPF坐标之间转换

据我所知,如果计算机没有使用默认的DPI设置,WPF坐标与"真实"屏幕坐标(像素坐标)不同.在我的程序中,我想(1)找出WPF窗口所在的监视器,以及(2)打开同一监视器左下角的另一个窗口.我听说WPF 没有相应的屏幕,所以我使用WinForms版本,如下所示,它在默认的96 DPI下工作正常:

public void ChooseInitialPosition(Window w) // w is some other window
{
    var scr = System.Windows.Forms.Screen.FromRectangle(
          new System.Drawing.Rectangle((int)w.Left, (int)w.Top, (int)w.Width, (int)w.Height))
          .WorkingArea;

    this.Left = scr.Right - Width;
    this.Top = scr.Bottom - Height;
}
Run Code Online (Sandbox Code Playgroud)

但在其他DPI中,这两个步骤都不正确,并且可能会使窗口完全脱离屏幕.

到目前为止,看起来我可以在第一部分使用Visual.PointToScreen:

var p1 = w.PointToScreen(new Point(0,0));
var p2 = w.PointToScreen(new Point(w.Width,w.Height));
var scr = System.Windows.Forms.Screen.FromRectangle(
    new System.Drawing.Rectangle((int)p1.X, (int)p1.Y, (int)(p2.X - p1.X), (int)(p2.Y - p1.Y))).WorkingArea;
Run Code Online (Sandbox Code Playgroud)

我不确定这是否正确,因为它可能无法正确解释边界.但第二部分更重要.如何将屏幕矩形"scr"转换为WPF空间,以便正确设置Left和Top?

.net wpf coordinates

11
推荐指数
1
解决办法
1万
查看次数

如何将"双"的位称为"长"

我想在C#中操纵浮点数的按位表示.BinaryWriter和BinaryReader这样做:

public virtual unsafe void Write(double value)
{
    ulong num = *((ulong*) &value);
    ...
}
public virtual unsafe double ReadDouble()
{
    ...
    ulong num3 = ...;
    return *((double*) &num3);
}
Run Code Online (Sandbox Code Playgroud)

有没有办法在没有不安全代码的情况下执行此操作,并且没有实际使用BinaryWriter和BinaryReader的开销?

.net floating-point bit-manipulation

10
推荐指数
3
解决办法
2529
查看次数

当Android应用程序崩溃时,我可以获得C++堆栈跟踪吗?

我的C++代码中出现的大多数错误导致应用程序只是退出,没有任何LogCat输出,并且设备上没有消息.空指针和错误使用JNI经常产生这个结果,不用说,它使调试变得非常困难.

目前我可以在ndk-gdb中使用'bt'命令获取堆栈跟踪,但是如果崩溃发生在启动的前2秒内则不会,因为ndk-gdb启动进程并在启动后附加到它.另外,ndk-gdb是不可靠的,经常说它找不到任何符号,或抱怨非致命的"SIGILL"错误.

有没有办法在应用程序崩溃时捕获错误并打印堆栈跟踪或其他信息?例如,如果有SIGSEGV,我想知道该应用尝试访问的地址.

c++ debugging android

10
推荐指数
1
解决办法
6727
查看次数

WPF:如何制作一个"pushlike"复选框?

我想制作一个看起来完全像按钮的CheckBox.我最初的微弱尝试根本不起作用.

<CheckBox x:Name="test">
    Testing!
    <CheckBox.Template>
        <ControlTemplate>
            <Button>
                <ContentPresenter/>
            </Button>
        </ControlTemplate>
    </CheckBox.Template>
</CheckBox>
Run Code Online (Sandbox Code Playgroud)

ContentPresenter不起作用(按钮为空),单击该按钮时,IsChecked属性不会切换.此外,当IsChecked为真时,我不知道如何使按钮看起来被推.

wpf checkbox button controltemplate

9
推荐指数
2
解决办法
1万
查看次数