在我的WPF应用程序中,我有一个ComboBox,它充满了ComboBoxItems的静态列表,因为它的内容永远不会改变.但是,因为我想将SelectedItem数据绑定到我的底层ViewModel,所以我希望每个ComboBoxItem也有一个单独的值,该值将分配给我的ViewModel属性.我有点麻烦让这个工作.
我的ComboBox声明如下:
<ComboBox Height="23" HorizontalAlignment="Stretch" Margin="2" Name="comboBox1" VerticalAlignment="Top"
SelectedItem="{Binding Path=Amount, Mode=TwoWay}" SelectedValuePath="Tag" >
<ComboBoxItem Content="None" Tag="0" />
<ComboBoxItem Content="Few" Tag="1" />
<ComboBoxItem Content="Some" Tag="2" />
<ComboBoxItem Content="Enough" Tag="3" />
<ComboBoxItem Content="Lots" Tag="4" />
<ComboBoxItem Content="Too much" Tag="5" />
</ComboBox>
Run Code Online (Sandbox Code Playgroud)
此ComboBox的SelectedItem绑定到ViewModel的Amount属性,该属性声明为整数:
public class MyViewModel : INotifyPropertyChanged
{
private int _amount = 3;
public int Amount
{
get { return _amount; }
set
{
_amount = value;
OnPropertyChanged("Amount");
}
}
//...
}
Run Code Online (Sandbox Code Playgroud)
我希望SelectedValuePath ="Tag"告诉WPF它应该使用Tag值绑定到ViewModel的Amount属性,但是当我运行这个应用程序并更改ComboBox的选定项时,调试跟踪告诉我:
System.Windows.Data Error: 23 : Cannot convert 'System.Windows.Controls.ComboBoxItem: Some' …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 Windows Server 2019(标准版,版本 1809,内部版本 17763)上安装 WinGet,但我无法让它工作......
当尝试此博客文章中的“直接安装”链接时,我收到以下链接ms-appinstaller:?source=https://aka.ms/getwinget,但我的浏览器无法理解该链接,因为我没有应用程序安装程序。
因此,我Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.appxbundle从同一篇博客文章中提到的 GitHub 发布页面下载了该版本(其中应包含应用程序安装程序和 WinGet)。因为我的系统没有获取 .appxbundle 文件,所以我尝试使用 Powershell 安装它:
Add-AppxPackage ".\Microsoft.DesktopAppInstaller_8wekyb3d8bbwe.appxbundle"
Run Code Online (Sandbox Code Playgroud)
但它抱怨它错过了Microsoft.VCLibs.140.00.UWPDesktop:
Add-AppxPackage : Deployment failed with HRESULT: 0x80073CF3, Package failed updates,
dependency or conflict validation.
Windows cannot install package Microsoft.DesktopAppInstaller_1.11.11451.0_x64__8wekyb3d8bbwe
because this package depends on a framework that could not be found. Provide the framework
"Microsoft.VCLibs.140.00.UWPDesktop" published by "CN=Microsoft Corporation, O=Microsoft
Corporation, L=Redmond, S=Washington, C=US", with neutral or x64 processor architecture and
minimum version 14.0.29231.0, …Run Code Online (Sandbox Code Playgroud) 当我在我的程序中使用Parallel.ForEach时,我发现有些线程似乎永远不会完成.事实上,它一直在反复产生新线程,这种行为是我没想到的,绝对不想要的.
我能够使用以下代码重现此行为,就像我的"真实"程序一样,它们都使用处理器和内存(.NET 4.0代码):
public class Node
{
public Node Previous { get; private set; }
public Node(Node previous)
{
Previous = previous;
}
}
public class Program
{
public static void Main(string[] args)
{
DateTime startMoment = DateTime.Now;
int concurrentThreads = 0;
var jobs = Enumerable.Range(0, 2000);
Parallel.ForEach(jobs, delegate(int jobNr)
{
Interlocked.Increment(ref concurrentThreads);
int heavyness = jobNr % 9;
//Give the processor and the garbage collector something to do...
List<Node> nodes = new List<Node>();
Node current = null;
for (int …Run Code Online (Sandbox Code Playgroud) .net c# concurrency parallel-extensions task-parallel-library
在对域类进行建模时,我发现Entity Framework允许您对继承关系进行建模,但不支持将基类型实例提升为其派生类型,即将数据库中现有的Person行更改为派生自Person的Employee.
显然,我并不是第一个对此感到疑惑的人,因为这个问题已经多次在Stack Overflow上被提出并回答(例如,见此处和此处).
如这些答案中所示,实体框架不支持这一点,因为在面向对象编程中不允许这样做:创建实例后,您无法更改其运行时类型.
很公平,从技术角度来看,我可以理解,一旦为一个对象分配了一个单独的内存块,之后添加一些额外的字节来保存派生类型的字段可能需要重新分配整个内存块,并且结果,意味着对象的指针现在已经改变,这反过来又引入了更多的问题.所以我觉得这很难实现,因此在C#中不受支持.
但是,除了从技术组件,答案(和这里也看到第1页最后一段)也似乎暗示着它被认为是不好的设计,当你想改变一个对象的运行时类型,说你不应该需要这种类型改变,而应该使用组合来代替这些情况.
坦率地说,我不明白为什么 - 我说完全有效的想要以与使用Person实例相同的方式工作Employee实例(即通过从Person继承Employee),即使在某个时间点a人员将被雇用为员工,或者员工退出并再次成为人员.
从概念上讲,我没有看到任何错误?
任何人都可以向我解释这个吗?
- 编辑,澄清,为什么这被认为是糟糕的设计:
public class Person
{
public string Name { get; set; }
}
public class Employee: Person
{
public int EmployeeNr { get; set; }
public decimal Salary { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
......但这不是?
public class Person
{
public string Name { get; set; }
public EmployeeInfo EmployeeInfo { get; set; }
}
public class EmployeeInfo
{ …Run Code Online (Sandbox Code Playgroud) 我注意到如果通过Start-DscConfiguration失败应用配置,它会写入错误流但不会抛出异常?也就是说,如果我执行以下操作:
try{
Start-DscConfiguration -Path ".\MyConfig" -Wait -Verbose
}catch{
#...
}
Run Code Online (Sandbox Code Playgroud)
......它永远不会在catch处理程序中结束.我怀疑这可能与以下事实有关:没有"-Wait",
Start-DscConfiguration为此启动异步作业,异步命令可能不会抛出异常,但在同步场景中,我非常想知道我的配置是否可以应用.
确定是否Start-DscConfiguration已成功完成的正确方法是什么?
MS CRM 2015允许您指定实体之间关系的属性映射.例如,对于下面显示的"contact_customer_accounts"关系,它定义了在通过帐户的"相关联系人"视图添加新联系人时,应将来自帐户的哪些属性复制到联系人.
但是,当我更改此类映射(并发布所有自定义项)时,它不会作为我的解决方案的一部分导出(或者就此而言是默认解决方案).当我在映射中的这种更改之前和之后比较customizations.xml文件时,它们(对于相关部分)完全相同 - 这些信息似乎不是导出的一部分?
我还找到了定制解决方案文件架构,它似乎也没有提到有关属性映射的任何内容.
我认为这些信息应该是解决方案输出的一部分 - 有人知道为什么不是吗?
更新:我在我的组织中导入了我的解决方案(包括帐户和联系人)并已发布.然后从"contact_customer_accounts"关系中删除一半映射并再次发布.最后导入相同的解决方案并再次发布:删除的映射没有返回.
所以我认为解决方案不包含映射信息是安全的.
c# ×3
.net ×1
combobox ×1
concurrency ×1
data-binding ×1
dsc ×1
dynamics-crm ×1
inheritance ×1
oop ×1
powershell ×1
winget ×1
wpf ×1