我的WPF绑定不起作用,因为我的视图模型已经覆盖了Equals和GetHashCode。如果我将其注释掉(对象区域),一切正常。
有关我的原因的更多信息:我所有的视图模型都有一个ID。我加载Id = 1的数据并设置datacontext。稍后,我重新加载数据(相同的ID,但其他属性可能已更改),我重置了datacontext,但没有任何反应(引发了DataContextChanged-event)。对于每个想将此标记为重复的人……不,我没有忘记INotifyPropertyChanged-Interface。设置数据上下文后,将刷新绑定,这与INotifyPropertyChanged无关。
有人知道如何刷新数据上下文吗? (顺便说一句,将其设置为null,然后再设置为我的新viewmodel不是解决方案,因为规定是,视图数据上下文永远不会为null)。这里是一些小的演示代码来重现此内容。 Window.xaml:
<Grid>
<Button Content="Button1" HorizontalAlignment="Left" Margin="565,84,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click"/>
<TextBox HorizontalAlignment="Left" Height="23" Margin="206,173,0,0" TextWrapping="Wrap" Text="{Binding Text}" VerticalAlignment="Top" Width="120"/>
<Button Content="Button2" HorizontalAlignment="Left" Margin="565,138,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_1"/>
<Button Content="Button3" HorizontalAlignment="Left" Margin="565,191,0,0" VerticalAlignment="Top" Width="75" Click="Button_Click_2"/>
</Grid>
Window.xaml.cs:
private void Button_Click(object sender, RoutedEventArgs e)
{
ViewModel vm = new ViewModel { Id = 1, Text = "Button1" };
DataContext = vm;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
ViewModel vm = new ViewModel { Id = 1, Text = "Button2" };
DataContext = vm;
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
ViewModel vm = new ViewModel { Id = 1, Text = "Button3" };
DataContext = vm;
}
ViewModel:
class ViewModel
{
public int Id { get; set; }
public string Text { get; set; }
#region Object-Stuff
public override int GetHashCode()
{
return Id.GetHashCode();
}
public override bool Equals(object obj)
{
ViewModel other = obj as ViewModel;
if ((object)other == null)
{
return false;
}
return Id == other.Id;
}
public virtual bool Equals(ViewModel other)
{
if ((object)other == null)
{
return false;
}
return Id == other.Id;
}
#endregion
}
所以,对于每个对此有兴趣的人。这是WPF中的错误。行为很奇怪,因为有时绑定有效,但是在大多数情况下,此示例中的文本框没有刷新。
WPF中的所有内容都与INotifyPropertyChanged-Interface一起使用,旨在通知UI有关数据更改的信息。如果我将其与主视图模型一起使用,则它可以工作。 (但是尽管如此,它也不是很好)。我将代码更改为以下代码,然后工作:
MainWindow.xaml:
<TextBox HorizontalAlignment="Left" Height="23" Margin="206,173,0,0" TextWrapping="Wrap" Text="{Binding ViewModel.Text}" VerticalAlignment="Top" Width="120"/>
MasterViewModel:
class MasterViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public void OnNotifyPropertyChanged(string propName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propName));
}
}
private ViewModel _viewModel;
public ViewModel ViewModel
{
get { return _viewModel; }
set
{
_viewModel = value;
OnNotifyPropertyChanged(nameof(ViewModel));
}
}
}
MainWindow.xaml.cs
public partial class MainWindow : Window
{
private MasterViewModel _vm = new MasterViewModel();
public MainWindow()
{
InitializeComponent();
DataContext = _vm;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
_vm.ViewModel = new ViewModel { Id = 1, Text = "Button1" };
//DataContext = vm;
}
private void Button_Click_1(object sender, RoutedEventArgs e)
{
_vm.ViewModel = new ViewModel { Id = 1, Text = "Button2" };
//DataContext = vm;
}
private void Button_Click_2(object sender, RoutedEventArgs e)
{
_vm.ViewModel = new ViewModel { Id = 1, Text = "Button3" };
//DataContext = vm;
}
}
在Viewmodel本身,没有任何变化!祝大家新年快乐...