如何以编程方式构造这段XAML?
<Grid Name="gridMarkets">
<Grid.RowDefinitions>
<RowDefinition Height="10" />
<RowDefinition Height="*" MinHeight="16" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="10" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
</Grid>
Run Code Online (Sandbox Code Playgroud)
它是动态解析和构造控件的优雅解决方案吗?
我想做点什么:
RowDefinition newRow = new RowDefinition();
newRow.Height = new GridLength(10);
newGrid.RowDefinitions.Add(newRow);
Run Code Online (Sandbox Code Playgroud)
但是我该如何指定*标志?
寻找任何一种想法来解决这个问题!谢谢!
我在Canvas上有一个拖放操作,当一个对象被拖入和拖出时,它应该做某事.我的问题是DragEnter/DragLeave事件在鼠标移动对象时继续触发,而不仅仅是在进入/退出时.鼠标移动得越快,事件发生的频率就越高.
Canvas DragOver事件移动了DraggedObject的Canvas.Top/Left,我认为这可能是我的问题,但我不知道如何解决这个问题.
我有一个TabControl,每个选项卡可以包含相同的UI,但具有不同的数据.在任何选项卡中,用户都可以单击按钮并弹出一个弹出窗口.这将Style属性设置为ViewModel,告诉它用于弹出UI的样式.Style绑定到附加到自定义PopupUserControl的自定义DependecyProperty.我的问题是,当弹出窗口的第二个副本在另一个选项卡中打开时,我收到以下错误(无论应用什么样式):
指定的元素已经是另一个元素的逻辑子元素.首先断开它.
ButtonClick命令:
MyViewModel vm = ((Button)sender).DataContext as MyViewModel;
if (vm != null)
{
Style popupStyle = (Style)Application.Current.FindResource("SomePopupStyle");
vm.EditPanelStyle= popupStyle ;
}
Run Code Online (Sandbox Code Playgroud)
这会触发Style上的PropertyChange事件
public Style EditPanelStyle
{
get { return _editPanelStyle; }
set
{
if (_editPanelStyle != value)
{
_editPanelStyle = value;
OnPropertyChanged("EditPanelStyle");
}
}
}
Run Code Online (Sandbox Code Playgroud)
这会触发ViewModelBase中的OnPropertyChanged事件
protected virtual void OnPropertyChanged(string propertyName)
{
this.VerifyPropertyName(propertyName);
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
var e = new PropertyChangedEventArgs(propertyName);
handler(this, e);
}
}
Run Code Online (Sandbox Code Playgroud)
该错误发生在handler(this, e);ViewModelBase的行中
编辑
TabItem包含一个Canvas和一堆可以添加/删除/移动/等的面板.每个Panel都有自己的资源目录.从Panel中我可以设置PopupStyle就好了,它可以毫无问题地应用.面板中使用的样式也在PanelResourceDictionary中定义.
与失败和成功的主要区别在于Style位于不同的位置.
编辑#2 …
我们遇到了一个问题,在那里
.Equals和.GetHashCode方法视为相等..EndCurrentEdit()窗口2会触发窗口1的绑定更新BindingContext我们发现这个问题与调用有关
((PropertyManager)ctrl.BindingContext[dataSource]).EndCurrentEdit();
Run Code Online (Sandbox Code Playgroud)
如果我们改变它
((PropertyManager)ctrl.BindingContext[dataSource, dataMember]).EndCurrentEdit();
Run Code Online (Sandbox Code Playgroud)
它工作正常.如果我们删除我们的.Equals和.GetHashCode覆盖,它也可以正常工作,因此两个对象模型不再被认为是相等的.
这对我来说没有意义,因为窗户是相同的,所以dataMember属性也是一样的.
从这个链接,我相信这些调用的定义是:
public BindingManagerBase this[object dataSource] {
get {
return this[dataSource, ""];
}
}
public BindingManagerBase this[object dataSource, string dataMember] {
get {
return EnsureListManager(dataSource, dataMember);
}
internal BindingManagerBase EnsureListManager(object dataSource, string dataMember) {
BindingManagerBase bindingManagerBase = null;
if (dataMember == null)
dataMember = "";
// Check whether data source wants to …Run Code Online (Sandbox Code Playgroud) 我的表单上有一堆Checkbox,其Checked属性绑定到数据模型上的Boolean属性:
chk1.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty1", false))
chk2.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty2", false))
chk3.DataBindings.Add(new BindingValue(this, "Checked", "MyBooleanProperty3", false))
Run Code Online (Sandbox Code Playgroud)
屏幕上的所有复选框都有一个共享事件处理程序,可确保将数据绑定值正确设置为选中的值.
private void AllCheckboxes_CheckedChanged(object sender, EventArgs e)
{
var chk = ((CheckBox)sender);
var binding = chk.DataBindings["Checked"];
if (binding != null)
binding.WriteValue();
}
Run Code Online (Sandbox Code Playgroud)
在某些情况下,第一次加载此表单和绑定时,我得到一个例外:
无法将值格式化为所需类型.
System.Windows上System.Windows.Forms.Binding.PullData(Boolean reformat,Boolean force)的System.Windows.Forms.BindToObject.SetValue(Object value)中的System.ComponentModel.ReflectPropertyDescriptor.SetValue(Object component,Object value) .Forms.Binding.WriteValue()
它适用于处理事件的第一个复选框,但第二个复选框将抛出此异常.
数据源是我的数据模型的接口
public interface IMyDataModel
{
bool MyBooleanProperty1 { get; set; }
bool MyBooleanProperty2 { get; set; }
bool MyBooleanProperty3 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
我可以通过在事件处理程序中的.WriteValue之前设置断点来验证数据模型本身是否设置正确.我甚至可以在绑定的布尔属性的setter中放置一个断点,并且它也被正确调用.
如果我将FormattingEnabled绑定的属性设置为true,它确实解决了问题.但我想知道为什么我首先必须这样做,因为我System.Boolean将UI对象中的bool属性绑定到数据源上的属性. …
过去两次我们重新启动了我们的sql server,我们的网站已经关闭了.原因似乎是因为tempdb正在重新创建,并且ASPState用户失去了对tempdb的读/写权限(它是一个ASP站点,会话数据存储在sql server中)
直到大约两周前,这不是问题.有谁知道如何阻止sql server重启后重置tempdb权限?或者为什么这最近才开始发生?我们正在使用MS SQL Server 2005.
例如,我的大多数实体都有DateCreated和DateModified字段.这些默认设置在SQL Server中设置为GetUtcDate().
如果我尝试创建一个实体并且不设置这些值,我会得到一个异常,说它无法运行SQL插入,因为日期值超出范围.有意义,因为C#默认日期是1/1/0001,而SQL Server的最小日期是1/1/1753.
那么有没有办法告诉EF要么使用SQL Server默认值,要么尝试插入尚未设置的列?
我正在阅读这篇文章,作者提出了使用DataTemplates定义ViewModel的建议,这是一种疯狂的方式(#7).我一直这样做,真的那么糟糕吗?
<DataTemplate DataType="{x:Type local:MyViewModel}">
<Grid>
...
</Grid>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)
我的大多数视图都只是一个定义一个或两个DataTemplate的ResourceDictionary.对我而言,这比为每个ViewModel创建UserControl更有意义.为什么我不想在WPF的可视化树中使用额外的图层?当DataTemplate为我做这件事时,为什么我要照顾将ViewModels映射到Views?这种语法真的是一种"疯子式"吗?
如果用户执行操作(例如删除项目),则会立即将其从UI中删除,然后使用TPL在后台线程上将其从数据库中删除.问题是如果用户在后台线程完成之前退出应用程序,该项目实际上永远不会被删除.
在关闭应用程序之前是否存在等待异步操作完成的标准方法?
我的异步调用看起来像这样:
if (MyObjectList.Contains(obj)) MyObjectList.Remove(obj);
Task.Factory.StartNew(() => DAL<MyEntities>.DeleteObject(obj));
Run Code Online (Sandbox Code Playgroud)
更新
这是我最后的代码.我很高兴看到它能够正常工作,但是如果我能改进的话,请告诉我.我还有很多东西需要学习:)
public partial class App : Application
{
private List<Task> _backgroundTasks = new List<Task>();
public App()
{
EventSystem.Subscribe<TaskStartedMessage>((e) =>
{
_backgroundTasks.Add(e.Task);
});
EventSystem.Subscribe<TaskEndedMessage>((e) =>
{
if (_backgroundTasks.Contains(e.Task))
_backgroundTasks.Remove(e.Task);
});
}
protected override void OnExit(ExitEventArgs e)
{
Task.WaitAll(_backgroundTasks.Where(p => !p.IsCompleted).ToArray(), 30000);
base.OnExit(e);
}
}
Run Code Online (Sandbox Code Playgroud)
在开始一项重要的后台任务时,我正在使用以下语法:
var task = Task.Factory.StartNew(() => DAL<MyEntities>.DeleteObject(obj));
EventSystem.Publish<TaskStartedMessage>(new TaskStartedMessage(task));
await task;
EventSystem.Publish<TaskEndedMessage>(new TaskEndedMessage(task));
Run Code Online (Sandbox Code Playgroud)
我正在使用AsyncCTP for await/ async,而Microsoft Prism EventAggregator用于事件系统.
如何在网格样式中设置Foreground所有子元素的颜色Grid?我知道我以前做过这个,但我不记得在哪里或如何.
<Style x:Key="MyGridStyle" TargetType="{x:Type Grid}">
// I want to set the font color here
</Style>
<Grid Style="{StaticResource MyGridStyle}">
...
</Grid>
Run Code Online (Sandbox Code Playgroud)
我知道我可以使用
<Grid.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Red" />
</Style>
<Style TargetType="{x:Type TextBox}">
<Setter Property="Foreground" Value="Red" />
</Style>
</Grid.Resources>
Run Code Online (Sandbox Code Playgroud)
但是我想把这个值设置在Style,而不是在Grid
wpf ×6
c# ×5
.net-3.5 ×2
binding ×2
mvvm ×2
xaml ×2
asp.net ×1
asynchronous ×1
data-binding ×1
datatemplate ×1
permissions ×1
sql-server ×1
styles ×1
tempdb ×1
view ×1
winforms ×1