请参考Josh Smith的文章WPF Apps与Model-View-ViewModeldevise模式 ,特别是RelayCommand的示例实现(在图3中)。 (无需阅读整个文章的这个问题。) 一般来说,我认为这个实现是非常好的,但是我有一个关于将CanExecuteChanged订阅委托给CommandManager的RequerySuggested事件的问题。 RequerySuggested的文档状态如下: 由于这个事件是静态的,所以它只能作为一个弱引用持有处理程序。 监听这个事件的对象应该对它们的事件处理器保持强有力的引用,以避免垃圾收集。 这可以通过在附加到该事件之前或之后拥有私有字段并将该处理程序指定为值来实现。 然而, RelayCommand的示例实现并不维护订阅的处理程序: public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } 这是否RelayCommand弱引用泄漏到RelayCommand的客户端,要求RelayCommand的用户了解RelayCommand的实现并自行维护一个实时引用? 如果是这样,是否有意义,例如,修改RelayCommand的实现类似于以下内容,以减轻CanExecuteChanged订阅者可能过早的GC: // This event never actually fires. It's purely lifetime mgm't. private event EventHandler canExecChangedRef; public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += […]
我已经将CollectionChanged eventhandler(onCollectionChanged)添加到其中一个ObservableCollection属性。 我发现onCollectionChanged方法仅在添加项目或将项目移除到集合的情况下才会被调用,但是在收集项目被编辑的情况下不会被调用。 我想知道如何发送一个集合中新增,删除和编辑项目的列表/集合。 谢谢。
我是MVVM模式的新手,并且对何时使用Code Behind有点困惑。 我现在有一个非常简单的表单,包括一个TextBox和一个DataGrid。 我想要的是能够让DataGrid基于TextBox更改其选定的项目。 我在Code Behind中做了这个,使用下面的代码可以正常工作: private void textBox1_TextChanged(object sender, TextChangedEventArgs e) { for (int i = 0; i < dataGrid1.Items.Count; i++) { string cellContent = dtReferral.Rows[i][0].ToString(); try { if (cellContent != null && cellContent.Substring(0, textBox1.Text.Length).Equals(textBox1.Text)) { object item = dataGrid1.Items[i]; dataGrid1.SelectedItem = item; dataGrid1.ScrollIntoView(item); //row.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next)); break; } } catch { } } } […]
我想弄清楚如何通过鼠标拖动上下移动预填充列表框中的项目。 我已经从微软的api中看到了Control.DoDragDrop方法,但是我仍然无法做任何事情。 我会很感激任何帮助,因为我是新的视觉工作室环境。
我有3个文本框( Id1 , Name和Salary )。 Id和Salary应该包含整数, Name只能包含字符。 我需要validation我的文本框,它应该显示错误,因为我input错误的字符或整数。 也可以这样做只有在Xaml没有代码隐藏? 我是新来的Wpf和validation请帮我所需的代码 这是Xaml代码: <TextBox Name="tb1" HorizontalAlignment="Left" Height="20" Margin="60,10,0,0" TextWrapping="NoWrap" Text="{Binding SelectedItem.Id,ElementName=dgsample}" VerticalAlignment="Top" Width="100" /> <TextBox Name="tb2" HorizontalAlignment="Left" Height="20" Margin="60,60,0,0" TextWrapping="NoWrap" Text="{Binding SelectedItem.Name, ElementName=dgsample}" VerticalAlignment="Top" Width="100"/> <TextBox Name="tb3" HorizontalAlignment="Left" Height="20" Margin="60,110,0,0" TextWrapping="NoWrap" Text="{Binding SelectedItem.Salary, ElementName=dgsample}" VerticalAlignment="Top" Width="100"/>
我的各种WPF应用程序显示FlowDocument的。 我可以使用打印WPF FlowDocument 的答案中描述的方法来打印它们。 现在我想添加一个“打印预览”function。 在正常情况下,我正在打印显示在窗口中的FlowDocument,所以我不需要打印预览。 但是在某些情况下,要打印的FlowDocument在内存中即时构build。 在这些情况下,我想在打印之前显示它。 现在,我当然可以popup一个新窗口并显示FlowDocument,但是 我希望预览真正感觉它是打印操作的一部分,而不是应用程序中的另一个窗口。 我不想在FlowDocumentScrollViewer中使用正常的FlowDocument。 它不是“任何规模”,而是需要限制在纸张的大小,具体的HxW比率和分页。 build议? 我应该只使用一个标准的窗口,在这种情况下,如何确保FlowDocument是在适当的比例? 有没有更多的“集成”的方式来作为Windows的一部分的PrintDialog UI的范围内预览? 谢谢
使用INotifyPropertyChanged时,指定属性名称的最佳方法是什么? 大多数示例将属性名称硬编码为PropertyChanged事件上的参数。 我正在考虑使用MethodBase.GetCurrentMethod.Name.Substring(4),但是对reflection开销有点不安。
我有一个名为textbox1的TextBox和一个名为button1的Button 。 当我点击button1我想浏览我的文件,只search图像文件(typesjpg,png,bmp …)。 当我select一个图像文件,并在文件对话框中单击确定,我想文件目录被写入textbox1.text像这样: textbox1.Text = "C:\myfolder\myimage.jpg"
我有一组控件,附带的命令和逻辑不断以相同的方式重用。 我决定创build一个拥有所有通用控件和逻辑的用户控件。 不过,我也需要控制能够保存可以命名的内容。 我尝试了以下内容: <UserControl.ContentTemplate> <DataTemplate> <Button>a reused button</Button> <ContentPresenter Content="{TemplateBinding Content}"/> <Button>a reused button</Button> </DataTemplate> </UserControl.ContentTemplate> 不过,似乎放在用户控件内的任何内容都不能被命名。 例如,如果我使用以下方式的控制: <lib:UserControl1> <Button Name="buttonName">content</Button> </lib:UserControl1> 我收到以下错误: 无法在元素“button”上设置名称属性值“buttonName”。 “button”在元素“UserControl1”的范围内,当在另一个范围中定义时,它已经有了一个名字注册。 如果我删除buttonName,然后编译,但是我需要能够命名的内容。 我怎样才能做到这一点?
我试图创build一个button,其中有一个图像,没有边框 – 就像Firefox的工具栏button,然后将鼠标hover在上面,看到完整的button。 我已经尝试将BorderBrush设置为Transparent ,将BorderThickness为0 ,并尝试了BorderBrush="{x:Null}" ,但仍可以看到button的轮廓。