[wpf绑定,如果等于和gethashcode,则不刷新(无需更改IPPROPERTYTYG)!

问题描述 投票:-1回答:1

我的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 binding equals gethashcode
1个回答
0
投票

所以,对于每个对此有兴趣的人。这是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本身,没有任何变化!祝大家新年快乐...

© www.soinside.com 2019 - 2024. All rights reserved.