在Model-View-ViewModel体系结构WPF应用程序中实现ViewModel时,似乎有两个主要选择如何使其成为databindable.我已经看到了DependencyProperty
用于View将要绑定的属性的实现,我已经看到了实现的ViewModel INotifyPropertyChanged
.
我的问题是我应该何时优先选择其中一个?有任何性能差异吗?将ViewModel依赖项提供给WPF真的是个好主意吗?做出设计决定时还需要考虑什么?
Button
如果你没有指定它的高度,一些WPF控件(比如)似乎很乐意消耗它'容器中的所有可用空间.
还有一些,比如我现在需要使用的那些,(多线)TextBox
而且ListBox
似乎更担心只需占用适合其内容所需的空间,而不是更多.
如果你将这些人放在一个单元格中UniformGrid
,它们将扩展以适应可用空间.但是,UniformGrid
实例并不适合所有情况.如果你有一个网格,其中一些行设置为*高度,以划分自身与其他*行之间的高度,该怎么办?如果你有一个StackPanel
,你有a Label
,a List
和a Button
,你怎么能得到列表占据标签和按钮没有吃掉的所有空间怎么办?
我认为这确实是一个基本的布局要求,但我无法弄清楚如何让它们填充他们可以填充的空间(将它们放入并将其DockPanel
设置为填充也不起作用,似乎,因为在DockPanel
只占用其子控件所需的空间).
一个可调整大小的GUI将是相当可怕的,如果你有一起玩Height
,Width
,MinHeight
,MinWidth
等.
你可以绑定你Height
和Width
属性,以你占据网格单元?或者还有另一种方法吗?
我有一个用户控件,我MainWindow
在运行时加载.我无法从包含窗口获取句柄UserControl
.
我试过了this.Parent
,但它总是空的.有谁知道如何从WPF中的用户控件获取包含窗口的句柄?
以下是控件的加载方式:
private void XMLLogViewer_MenuItem_Click(object sender, RoutedEventArgs e)
{
MenuItem application = sender as MenuItem;
string parameter = application.CommandParameter as string;
string controlName = parameter;
if (uxPanel.Children.Count == 0)
{
System.Runtime.Remoting.ObjectHandle instance = Activator.CreateInstance(Assembly.GetExecutingAssembly().FullName, controlName);
UserControl control = instance.Unwrap() as UserControl;
this.LoadControl(control);
}
}
private void LoadControl(UserControl control)
{
if (uxPanel.Children.Count > 0)
{
foreach (UIElement ctrl in uxPanel.Children)
{
if (ctrl.GetType() != control.GetType())
{
this.SetControl(control);
}
}
}
else
{
this.SetControl(control);
} …
Run Code Online (Sandbox Code Playgroud) 我试图TreeView
绑定我的集合,以便所有组显示嵌套组,每个组将显示条目.
我如何使用HierarchicalDataTemplate
它TreeView
来处理子组和条目集合?
组显示子组和条目:
Example:
Group1
--Entry
--Entry
Group2
--Group4
----Group1
------Entry
------Entry
----Entry
----Entry
--Entry
--Entry
Group3
--Entry
--Entry
Run Code Online (Sandbox Code Playgroud)
namespace TaskManager.Domain
{
public class Entry
{
public int Key { get; set; }
public string Name { get; set; }
}
}
namespace TaskManager.Domain
{
public class Group
{
public int Key { get; set; }
public string Name { get; set; }
public IList<Group> SubGroups { get; set; }
public IList<Entry> Entries …
Run Code Online (Sandbox Code Playgroud) 这可能是一个微不足道的问题,但目前我正在为未来的同事做一些内联文档,并偶然发现了类似的事情:
/// <summary>
/// This Class is totaly useless
/// </summary>
public class DummyClass {
/// <summary>
/// Will do nothing
/// </summary>
public void DoNothing() {
}
/// <summary>
/// Will do nothing async
/// </summary>
/// <returns></returns> <---- What to write here?
public async Task DoNothingAsync() {
await Task.Run(() => { });
}
}
Run Code Online (Sandbox Code Playgroud)
您可能知道,在Method/Field/Class/whatever上方键入3个斜杠会触发VisualStudio执行其Summary-Snippet-Completion.
题
是Task
实际上是一个有效的返回值?如果是这样,我会写什么<returns></returns>
?
我当然知道,我可以忽略这一点,但为了完整起见我愿意在那里写东西.
我有一个实体框架数据库第一个项目.这是模型的提取:
public partial class LedProject
{
public LedProject()
{
this.References = new HashSet<LedProjectReference>();
this.Results = new HashSet<LedProjectResult>();
this.History = new HashSet<LedProjectHistory>();
}
public string Identifier { get; set; }
public string Name { get; set; }
public Nullable<System.DateTime> CompletionDate { get; set; }
public System.DateTime CreationDate { get; set; }
public System.Guid ProjectId { get; set; }
public string Comment { get; set; }
public virtual User ContactUser { get; set; }
public virtual User CreationUser { get; set; } …
Run Code Online (Sandbox Code Playgroud) 我正在使用MVVM模式的中型WPF应用程序.ViewModels用于INotifyPropertyChanged
刷新各自的视图.
这种方法很有效,除了一个问题:当这个应用程序长时间运行(3-7天)时,视图(整个应用程序中的每个视图!)突然停止更新它们的绑定属性.
如果我在ViewModels中设置一个断点,那么它们就会快乐地走开,呼唤PropertyChanged
就像没有错.但是,如果我在View绑定的ViewModel对象的getter中设置断点,则永远不会调用getter!
我很难过,甚至不知道如何正确调试这个问题.我已检查Visual Studio输出窗口是否存在数据绑定错误,但一切看起来都很正常.几乎就像WPF数据绑定引擎在后台崩溃一样.此应用程序还监视未处理的异常(AppDomain.UnhandledException
和Dispatcher.UnhandledException
),但不会抛出任何异常.
简介:经过很长一段时间后,Views停止更新其数据绑定,但ViewModel仍在调用PropertyChanged事件.
任何建议???
我一直在试验经常提到的MVVM模式,在某些情况下我很难定义清晰的界限.在我的应用程序中,我有一个对话框,允许我创建到Controller的连接.对话框有一个ViewModel类,这很简单.但是,该对话框还包含一个附加控件(由a选择ContentTemplateSelector
),该控件根据所连接的控制器的特定类型而变化.此控件具有自己的ViewModel.
我遇到的问题是,当我按OK键关闭对话框时,我需要实际创建请求的连接,这需要在内部Controller特定的ViewModel类中捕获的信息.简单地让所有特定于Controller的ViewModel类实现构建连接的公共接口是很诱人的,但是内部ViewModel是否应该真正负责这种构造?
我的一般问题是:是否有任何普遍接受的设计模式可用于ViewModel如何与彼此进行交互,特别是当"父"VM需要来自"子"VM的帮助以便知道该怎么做?
编辑:
我确实想出了一个比我原先想的更清洁的设计,但我仍然不确定这是否是'正确'的方法.我有一些后端服务,允许ContentTemplateSelector查看Controller实例并伪魔术地找到要为连接构建器显示的控件.让我烦恼的是,我的顶级ViewModel必须查看DataContext
生成的控件并将其转换为适当的界面,这似乎是一个坏主意(为什么View DataContext
与创建连接有关? ?)
我结束了这样的事情(简化):
public interface IController
{
IControllerConnectionBuilder CreateConnectionBuilder();
}
public interface IControllerConnectionBuilder
{
ControllerConnection BuildConnection();
}
Run Code Online (Sandbox Code Playgroud)
我有我的内部ViewModel类实现IControllerConnectionBuilder
,Controller返回内部ViewModel.顶级ViewModel然后可视化IControllerConnectionBuilder
(通过伪魔法机制).它仍然困扰我一点,这是我的内部ViewModel执行构建,但至少现在我的顶级ViewModel不必知道脏细节(它甚至不知道或不关心可视化控件正在使用视图模型).
如果有办法进一步清理这个问题,我欢迎提出更多想法.我仍然不清楚ViewModel对于它有多大的责任.
在我的WinForms中,我有DataGridView
.我想一次选择完整行,所以我设置SelectionMode
为FullRowSelect
.现在我有问题,因为在开始时我的表单为第一行加下划线(所选行的集合为空,第一行未选中但仅加下划线).我尝试了很多东西,比如:
private void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e)
{
dataGridView1.ClearSelection();
}
Run Code Online (Sandbox Code Playgroud)
一切都失败了,因为事实上没有选择.
我该怎样摆脱这个下划线?
谢谢你的帮助!
我真的不知道如何寻找我想要实现的目标.我将添加两张图片,以更好的方式向您展示我在这里所做的事情.
正如您所看到的,我在防火墙中添加了一个阻止规则,该规则将阻止特定应用程序的一系列地址(第二个图像的第一个规则).
有没有办法在Windows手机上做类似的事情?我不是在寻找一些代码或任何东西.只是为了一些指导.我应该在哪里看?我应该寻找什么?Windows手机没有防火墙,我不想使用任何外部防火墙应用程序,如果有...
c# ×8
wpf ×5
mvvm ×3
.net ×2
architecture ×2
data-binding ×2
async-await ×1
datagridview ×1
firewall ×1
ip-address ×1
layout ×1
treeview ×1
winforms ×1
xaml ×1