在WPF中定义DataContext似乎有两种主要方式:
App.xaml.cs(取自WPF MVVM Toolkit模板):
public partial class App : Application
{
private void OnStartup(object sender, StartupEventArgs e)
{
// Create the ViewModel and expose it using the View's DataContext
MainView mainView = new MainView();
MainViewModel mainViewModel = new MainViewModel();
mainViewModel.LoadCustomers("c:\\testdata2\\Customers.xml");
mainView.DataContext = mainViewModel;
mainView.Show();
}
}
Run Code Online (Sandbox Code Playgroud)
Window1.xaml:
<DockPanel>
<StackPanel
HorizontalAlignment="Left"
DockPanel.Dock="Top"
Orientation="Horizontal">
<StackPanel.DataContext>
<local:CustomerViewModel />
</StackPanel.DataContext>
<TextBlock Text="{Binding Path=FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding Path=LastName}" />
</StackPanel>
<StackPanel
HorizontalAlignment="Left"
VerticalAlignment="top" …Run Code Online (Sandbox Code Playgroud) 我想要一个可以与任何Flags样式枚举一起使用的通用函数来查看是否存在标志.
这不会编译,但如果有人有建议,我会很感激.
public static Boolean IsEnumFlagPresent<T>(T value,T lookingForFlag)
where T:enum
{
Boolean result = ((value & lookingForFlag) == lookingForFlag);
return result ;
}
Run Code Online (Sandbox Code Playgroud) 我正在学习WPF.
我想在我的App.xaml.cs中提供我自己的Main方法,而不是在App.g.cs中为我生成一个.但是我不断遇到冲突因为我还没有找到如何阻止生成额外的Main.
我的项目文件或其他地方是否有设置控制此设置?
我是一个很好的Visual Studio解决方案和项目结构的坚持者.
我即将开始WPF概念证明工作.
任何人都可以推荐一些他们使用过的WPF项目结构并且发现效果很好吗?
这里http://drwpf.com/blog/2007/10/01/58/
他们有一个我喜欢的建议:
Root
- Pages
- Controls
- Resources
App.xaml
Run Code Online (Sandbox Code Playgroud)
页面,控件和资源是文件夹.
有没有人发现某些结构运作良好/不能正常工作?
此外,如果你们这样做,我宁愿不进入"模型视图演示者"讨论.
有没有一种实用的方法让我们慢慢将WinForms应用程序演变为WPF,而不会为奇怪的互操作场景创建支持梦魇?
背景资料:
我们有一个庞大的战舰灰色WinForms应用程序,大约60-75个用户的内部组使用.我们开始遇到可以看到在WPF中使用应用程序带来好处的地方,但这还不足以证明大型项目完全重写它的合理性.应用程序中的所有屏幕都是自包含的WinForms用户控件,而WinForms应用程序只是一个处理菜单,打开/关闭表单,提供一些共享帮助方法等的shell ...
到目前为止,我们最好的想法是将shell应用程序转换为WPF,然后在其中托管WinForms用户控件.我们认为我们可以随着时间的推移转换用户控件,将这些更改与具有足够业务价值的计划相结合,以支持额外的工作.我担心互操作性能如何以及它将如何影响性能.我也关注我们如何过渡到应用程序的新外观.让shell应用程序看起来很时髦,然后在其中托管旧的战舰灰色用户控件似乎很奇怪,在WPF中创建shell应用程序并使其看起来就像在WinForms中一样.
如果其中一个Caliburn,Prism或其他类似的框架可以缓解过渡,我们也愿意探索这些选择.
我们试图提出一种虚拟化的好方法TreeView,数据并不是真正的问题,因为它非常轻(每个项目大约16个字节),问题是我们可能有数万个,尽管实际上数据只需要160 kb的内存,treeview项目确实使用了更多的内存.我们现在尝试使用3种不同的树进行虚拟化,WPF,Infragistics和Telerik.所有这些都有很大的问题,使它们无法用于我们的应用程序:
WPFTreeView:滚动条显示了一些怪异的行为,周围很多跳跃,变化大小不一致,用鼠标拖动它不能正常工作,滚动(跳来回)
Telerik:项目消失,滚动条也不稳定,项目随机展开崩溃,样式不起作用
Infragistics:项目根本没有虚拟化,每个项目都留在内存中,使虚拟化无用.
我们几个月来一直在努力解决这个问题,但我们还没有找到一个好的解决方案.有没有人成功实现TreeView了超过9000项的虚拟化?如果是这样,你的策略是什么?你使用了第三方控件吗?它100%有效吗?
任何建议都非常感谢.
谢谢.
有一些帖子讨论ListView.SelectedItems了为非平凡数量的代码添加数据绑定能力.在我的场景中,我不需要设置它ViewModel,只需获取选定的项目以便对它们执行操作并且它由命令触发,因此也不需要推送更新.
是否有一个简单的解决方案(在代码行方面),可能在代码隐藏?只要View并且ViewModel不需要互相引用,我就可以使用代码隐藏.我认为这是一个更通用的问题:" VM从按需查看数据的最佳实践 ",但我似乎找不到任何东西......
我有一个WinForms控件,里面我有一个TableLayoutPanel包含多个ElementHosts,每个ElementHost包含一个WPF控件.
一切都很好,除非控件的大小比窗口大,并且ScrollBar在那里; 当我向下滚动时,控件变得扭曲,就像这样 -

在最大化窗口或重新调整窗口大小时,控件可以正确渲染(减小控件的大小,使控件离开可见区域,然后再次增大大小以使其返回可见区域)
在WPF窗口的同一窗口中,WinForms控件不会发生这种情况; 知道为什么会这样,有什么解决方案吗?
我有一个TextBox实现的对象的属性绑定IDataErrorInfo.我成立Validation.ErrorTemplate的TextBox,并能正常工作.问题是我在a上有这些TabControl,如果我将标签更改为另一个标签然后返回到初始标签(其中TextBox),则验证模板不再显示.它看起来像是经过验证的(就像值是正确的),但实际上并非如此.
这是IDataErrorInfo对象 - 请注意,"正确"值是一个长度为2的字符串:
public class Presenter : IDataErrorInfo
{
public Presenter()
{
this.Property = String.Empty;
}
public string Property { get; set; }
public string Error { get { return null; } }
public string this[string columnName]
{
get
{
if (columnName == "Property")
{
if (this.Property.Length == 2)
return null;
else
return "Invalid property length!";
}
else return null;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是XAML:
<TabControl …Run Code Online (Sandbox Code Playgroud) 我想知道你如何决定何时使用converters以及何时使用triggers.我更喜欢在GUI上使用触发器来操作(比如显示/隐藏控件,改变它们的外观等).
前段时间我使用了一个BooleanToVisibilityConverter用于此目的,但现在,我只是不需要它,我做所有与visibility使用触发器相关的事情,我甚至开始思考" 由MS团队创建一个目的是什么BooleanToVisibilityConverter?" .通常,当我有可能尝试使用声明方式编写代码时 - 在本例中 - XAML.
你对此有何看法?
wpf ×9
.net ×6
c# ×3
data-binding ×2
mvvm ×2
winforms ×2
xaml ×2
app.xaml ×1
converter ×1
datacontext ×1
elementhost ×1
enum-flags ×1
enums ×1
listview ×1
tabcontrol ×1
treeview ×1
triggers ×1
validation ×1