- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在将 VB.NET Winforms 项目转换为 C# WPF。
我有一个包含两个 WPF 窗口和一个 ViewModel 作为引用项目的项目。
public class SheepViewModel : INotifyPropertyChanged
{
private string _CurrentEventName;
public string CurrentEventName
{
get { return _CurrentEventName; }
set
{
_CurrentEventName = value;
OnPropertyChanged("CurrentEventName");
}
}
static SheepViewModel _details;
public static SheepViewModel GetDetails()
{
if (_details == null)
_details = new SheepViewModel();
return _details;
}
public event PropertyChangedEventHandler PropertyChanged;
private void OnPropertyChanged(string prop)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(prop));
Console.WriteLine(prop + " has changed");
}
}
我显示内容的窗口如下所示。
<Window
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:SheepViewModel;assembly=SheepViewModel"
xmlns:ShaderEffectLibrary="clr-namespace:ShaderEffectLibrary;assembly=ShaderEffectLibrary" x:Class="Sheep_Score_3._1.ScoreScreen"
mc:Ignorable="d"
Title="ScoreScreen" Height="540" Width="920" WindowStartupLocation="CenterScreen">
<Window.DataContext>
<vm:SheepViewModel/>
</Window.DataContext>
<Viewbox x:Name="Stand1ViewBox" RenderTransformOrigin="0.5,0.5">
<Canvas x:Name="StandViewBox" Height="112.513" Margin="0,1100,2,0" VerticalAlignment="Bottom" RenderTransformOrigin="0.493,0.473" Background="#FF999999" Width="2268">
<TextBlock x:Name="CurrentEventName" Canvas.Left="270.9" TextWrapping="Wrap" Width="1104.815" FontFamily="Calibri" FontSize="29.333" FontStyle="Italic" Canvas.Top="-1.649" Text="{Binding Path=CurrentEventName}"/>
</Canvas>
</Viewbox>
</Window>
My MainWindow which is a control window looks like this
```xaml
<Window x:Class="Sheep_Score_3._1.MainWindow"
xmlns:xctk="http://schemas.xceed.com/wpf/xaml/toolkit"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:vm="clr-namespace:SheepViewModel;assembly=SheepViewModel"
mc:Ignorable="d"
Title="MainWindow" Height="433.689" Width="941.194">
<Window.DataContext>
<vm:SheepViewModel/>
</Window.DataContext>
<Grid Margin="0,0,0,0">
<TextBox x:Name="CurrentEventName" Height="23" Margin="131.01,163.013,0,0" TextWrapping="Wrap" VerticalAlignment="Top" HorizontalAlignment="Left" Width="327.151" Text="{Binding CurrentEventName, Mode=TwoWay}"/>
</Grid>
</Window>
如果我在控制窗口文本框中键入内容,它会出现在文本 block 的显示窗口中,因此我的绑定(bind)正在工作,并且我可以看到引发了 INotifyPropertyChanged.PropertyChanged
事件。这一切都很好。
但是,如果我以编程方式更改属性,我仍然可以看到引发了 INotifyPropertyChanged.PropertyChanged
事件,但是文本框和文本 block 不会更新为新值。
SheepViewModel.SheepViewModel.GetDetails().CurrentEventName = "This is the new value";
我是不是漏掉了什么?
最佳答案
我真的很惊讶文本更新对你有用;它绝对不在我身边。原因如下:
您在两个窗口中都有以下代码段:
<Window.DataContext>
<vm:SheepViewModel/>
</Window.DataContext>
这基本上是说:创建一个新的 SheepViewModel 实例并将其设置为窗口的数据上下文。因为你在两个窗口中都有它,所以每个窗口都有一个单独的 ViewModel 实例。由于 CurrentEventName
属性是一个实例属性,因此该值不会在实例之间共享,也不会正确更新。
当您尝试以编程方式更新值时,您调用 SheepViewModel.GetDetails()
。这会创建另一个实例,与控件使用的实例完全无关。因此,您看不到任何更新。
你想要的是以上所有使用一个 View 模型实例。为此,您可以从后面的代码中设置窗口的 DataContext。您可以在窗口中使用以下构造函数,而不是使用上面的 XAML 代码段:
public DisplayWindow()
{
InitializeComponent();
this.DataContext = SheepViewModel.GetDetails();
}
这确保窗口引用通过 GetDetails
方法检索的单例实例。
关于c# - INotifyPropertyChanged 困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35166810/
我在我的 LINQ-to-SQL 类中修改了我的数据源(通过旧的删除和拖回方法),并且惊讶地看到 INotifyPropertyChanging 和 INotifyPropertyChanged 接口
我喜欢对需要 INotifyPropertyChanged 接口(interface)的完整属性进行一些较少重复和浪费的编码,并进行自定义属性。 背景 今天,为了在窗口中使用具有动态更新值的 MVVM
INotifyPropertyChanged 的目的是什么。我知道每当更改属性时都会触发此事件,但是 View /用户界面如何知道触发了此事件: 这是实现 INotifyPropertyChang
我已经设置了一个属性并实现了 INotifyPropertyChanged 像这样... public event PropertyChangedEventHandler PropertyChange
我有一个类(我们称它为 MyContainerClass ),它是其他几个类的容器(我们称它们为 ClassA 到 ClassF )。 ClassA至ClassF继承相同的基类(我们称之为 MyBas
鉴于: public class MyClass : INotifyPropertyChanged { public List _TestFire = new List(); stri
首先,我想说下面的示例过于简单化。 假设您已绑定(bind) WPF 控件。 Window 绑定(bind)到实现 INotifyPro
我想将窗口中的 TextBox 绑定(bind)到作为 View 模型变量的类中包含的属性,并确保 INotifyPropertyChanged 的 PropertyChanged 事件从类传播到
所有使用 MVVM 的 Silverlight 示例都使用名为 IPropertyChanged 的接口(interface)。它背后的概念是什么,为什么我们需要在设置一些值时引发事件? 例如:-
我正在阅读最新的Prism 4发行版的源代码,并且对解决此问题感兴趣。 ViewModels有一个基类,它实现INotifyPropertyChanged和INotifyDataErrorInfo并提
关闭。这个问题需要更多 focused .它目前不接受答案。 想改进这个问题?更新问题,使其仅关注一个问题 editing this post . 5年前关闭。 Improve this questi
我的应用程序中有 2 个 ViewModel。第一个(FirstPageViewModel)负责在我的 View 中的文本框中显示的数据。另一个 ViewModel (NavigationViewMo
这是我目前实现INotifyPropertyChanged的方式- public class ViewModel : INotifyPropertyChanged { public Perso
我的问题似乎是“范围”,尽管我不确定这是正确的术语。我想在设置自定义对象中的属性时通知只读列表重新评估自身。我相信它根本不知道它的存在。也许有一个简单的方法可以解决这个问题,我想不出,但我正在画一个空
在 WPF 中,我们(至少)有两个线程:渲染线程和 UI 线程。当我针对某些属性更改引发事件 OnNotifyPropertyChanged 时,它会在 UI 线程上引发。需要将此信息分派(dispa
下面的代码基于此 post : 我的问题:在这个简单的示例中,我看不出我做错了什么来让 INotifyPropertyChanged 导致 textBox1 绑定(bind)自动反射(reflect)
INotifyPropertyChanged 在 View 模型中对于数据绑定(bind)到 View 显然非常有用。当我想要通知属性更改时,我是否也应该在我的应用程序的其他部分(例如业务层)中使用此
假设我有一个订单行对象集合... public class OrderLine { public decimal Qty { get; set; } public decimal Co
我在此链接中看到以下代码:An elegant way to implement INotifyPropertyChanged 我是表达式树的新手。谁能解释一下这段代码是如何简单工作的? 谢谢 pri
我在给定 Type 的字段和属性上循环,我想测试字段类型或属性 Type 是否实现了 INotifyPropertyChanged。 也许这听起来很奇怪,但我会解析字段/属性,例如字符串、整数和其他类
我是一名优秀的程序员,十分优秀!