ReactiveList不在GUI中更新

问题描述:

我试图很好地使用ReactiveList,并且我认为我很接近。ReactiveList不在GUI中更新

我的期望是,只有“丰田”被用户按下滤波器按钮

XAML(是的,快速Ñ脏,对于过滤器没有命令)之后显示

<Window 
    x:Class="WpfApplication1.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" 
    Height="350" 
    Width="525"> 
    <StackPanel> 
     <ComboBox 
      ItemsSource="{Binding Path=CarsVM}" 
      DisplayMemberPath="Name" /> 

     <Button 
      Click="ButtonBase_OnClick"> 
      Filter 
     </Button> 

    </StackPanel> 
</Window> 

代码

using System.Windows; 
using ReactiveUI; 

namespace WpfApplication1 
{ 

    public partial class MainWindow 
    { 
     private readonly ViewModel _viewModel; 

     public MainWindow() 
     { 
      InitializeComponent(); 

      _viewModel = new ViewModel(); 
      DataContext = _viewModel; 
     } 

     private void ButtonBase_OnClick(object sender, RoutedEventArgs e) 
     { 
      _viewModel.ChangeFilter(); 
     } 
    } 
} 

public class CarViewModel : ReactiveObject 
{ 
    private bool _isVisible = true; 

    public CarViewModel(string name) 
    { 
     Name = name; 
    } 

    public bool IsVisible 
    { 
     get { return _isVisible; } 
     set 
     { 
      _isVisible = value; 
      this.RaiseAndSetIfChanged(ref _isVisible, value); 
     } 
    } 

    public string Name { get; set; } 
} 

public class ViewModel 
{ 
    private readonly ReactiveList<CarViewModel> _cars = new ReactiveList<CarViewModel> 
    { 
     new CarViewModel("bmw"), 
     new CarViewModel("toyota"), 
     new CarViewModel("opel") 
    }; 


    public ViewModel() 
    { 
     _cars.ChangeTrackingEnabled = true; 

     CarsVM = _cars.CreateDerivedCollection(x => x, x => x.IsVisible); 
    } 

    public IReactiveDerivedList<CarViewModel> CarsVM { get; set; } 

    public void ChangeFilter() 
    { 
     foreach (var car in _cars) 
     { 
      car.IsVisible = car.Name.Contains("y"); 
     } 
    } 
} 

你的bug在IsVisible的setter中。通过预先分配_isVisible的值,RaiseAndSetIfChanged总是认为该值从未改变过。删除_isVisible = value;和一切应该工作。哈哈!

+0

哈!当然。当发现一个框架常识似乎被禁用。保罗。时间耦合在开始时总是很棘手 – buckley 2014-09-13 07:16:12

+0

没有时间耦合... RaiseAndSet做2件事:) – buckley 2014-09-15 07:55:55