微软应该已经实现了一些有趣的东西INotifyPropertyChanged,就像在自动属性中一样,只需指定{get; set; notify;}
我认为这样做很有意义.或者有任何并发症吗?
我们自己可以在我们的属性中实现类似'notify'的内容.是否有一个优雅的解决方案,INotifyPropertyChanged在您的班级实施或唯一的方法是通过提高PropertyChanged每个属性中的事件.
如果没有,我们可以写一些东西来自动生成一段代码来引发PropertyChanged 事件吗?
当我希望将控件绑定到我的对象的属性时,我必须提供属性的名称作为字符串.这不是很好,因为:
是否有一个设计模式可以解决这个问题,但仍然易于使用数据绑定?
(这是WinForm,Asp.net和WPF中的一个问题,很可能是很多其他系统)
我现在已经找到了" C#中的nameof()运算符的变通方法:typesafe databinding ",它也是解决方案的一个很好的起点.
如果您在编译代码后愿意使用后处理器,那么notifypropertyweaver非常值得关注.
当绑定在XML而不是C#中完成时,任何人都知道WPF的良好解决方案吗?
人们对INotifyPropertyChanged.PropertyChanged在视图模型中触发的简单.NET属性何时足够有任何指导?那么你什么时候想要升级到一个完整的依赖属性?或者DP主要用于观看?
我什么时候应该在WPF中使用依赖属性?
它们是静态的,因此与使用.NET属性相比,我们在内存上节省了很多.在.NET属性上使用依赖项属性的其他好处是:1)不需要检查线程访问2)提示要包含的元素等...
所以我似乎总是应该在我使用WPF的项目中使用依赖属性?
也许对于帮助类的一些微不足道的属性来说,我可以摆脱.NET属性......
我需要观察属性的变化.哪种方法在性能和内存使用方面更好:实现INotifyPropertyChanged或使用DependencyProperty?
注意:是的,我在ViewModel中已经阅读了另一个问题:INotifyPropertyChanged与DependencyProperty.
我试图想出一种不显眼的方式来向用户显示小错误消息.所以我在表单中添加了状态栏,
<StatusBar Margin="0,288,0,0" Name="statusBar" Height="23" VerticalAlignment="Bottom">
<TextBlock Name="statusText">Ready.</TextBlock>
</StatusBar>
Run Code Online (Sandbox Code Playgroud)
然后当他们点击"添加"按钮时,它应该做一些事情,或者显示错误信息:
private void DownloadButton_Click(object sender, RoutedEventArgs e)
{
addressBar.Focus();
var url = addressBar.Text.Trim();
if (string.IsNullOrEmpty(url))
{
statusText.Text = "Nothing to add.";
return;
}
if (!url.Contains('.'))
{
statusText.Text = "Invalid URL format.";
return;
}
if (!Regex.IsMatch(url, @"^\w://")) url = "http://" + url;
addressBar.Text = "";
Run Code Online (Sandbox Code Playgroud)
但是这个消息只是存在于应用程序的生命周期......我想我应该在大约5秒后重置它...我怎么能设置一个计时器来做到这一点?
额外奖励:我如何给它一个漂亮的淡出效果呢?
我创造了一个System.Timers.Timer,
private Timer _resetStatusTimer = new Timer(5000);
void _resetStatusTimer_Elapsed(object sender, ElapsedEventArgs e)
{
statusText.Text = "Ready";
}
Run Code Online (Sandbox Code Playgroud)
但是Elapsed事件运行在与UI不同的线程上,它不喜欢...如何解决这个问题?
我知道ViewModel不应该具有View的任何知识,但我如何从ViewModel调用MediaElement.Play()方法,而不是在ViewModel中引用View(或直接引用MediaElement)?
其他(链接)问题:如何在不违反MVVM模式的情况下从ViewModel管理View的控件可见性?
我是MVVM的新手,我正在开发一个应用程序.我有一个有很多属性的表单视图.大约50.我无法将这些分隔成用户控件,因为我会破坏mvvm原则.
我无法将这些分成模型,因为它们包含逻辑.PropertyChange,错误更改,这些不是poco类,这些不是模型.
如果我在同一个视图模型中保留了60个属性,那会不会很好?
我认为这不对吗?你会如何组织这些?
我正在使用DependencyProperties 构建一个简单的UserControl示例,以便可以在XAML(下面的代码)中更改控件的属性.
但是当然在我的应用程序中我不希望这个控件具有紧密耦合的代码隐藏,而是用户控件将是一个名为"DataTypeWholeNumberView"的视图,它将拥有自己的ViewModel,称为"DataTypeWholeNumberViewModel".
所以我将把下面的DependencyProperty逻辑实现到ViewModel中,但是在ViewModel中我通常会继承INotifyPropertyChanged,它似乎给了我相同的功能.
那么之间的关系是什么:
XAML:
<UserControl x:Class="TestDependencyProperty827.SmartForm.DataTypeWholeNumber"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<StackPanel HorizontalAlignment="Left" VerticalAlignment="Top" Orientation="Horizontal">
<TextBlock Text="{Binding Label}"/>
</StackPanel>
</StackPanel>
</UserControl>
Run Code Online (Sandbox Code Playgroud)
代码背后:
using System.Windows;
using System.Windows.Controls;
namespace TestDependencyProperty827.SmartForm
{
public partial class DataTypeWholeNumber : UserControl
{
public DataTypeWholeNumber()
{
InitializeComponent();
DataContext = this;
}
public string Label
{
get
{
return (string)GetValue(LabelProperty);
}
set
{
SetValue(LabelProperty, value);
}
}
public static readonly DependencyProperty LabelProperty =
DependencyProperty.Register("Label", typeof(string), typeof(DataTypeWholeNumber),
new …Run Code Online (Sandbox Code Playgroud) 我有一个ObservableCollection绑定到a WPF ListView,并且所有值都显示正确.但是,当具有双向绑定的内容发生变化时,如何获得通知?
我应该INotifyPropertyChanged像使用一样Winforms吗?或者有更好的做法来做这些吗?
我看到有人建议dependency properties在线使用,但不确定这是不是应该做什么.
wpf ×8
c# ×7
.net ×5
mvvm ×3
data-binding ×2
binding ×1
mediaelement ×1
mvvm-light ×1
refactoring ×1
type-safety ×1
visibility ×1
winforms ×1