WPF触发器CollectionViewSource从另一个属性更改刷新

时间:2016-09-15 11:05:46

标签: c# wpf

我有一个CollectionViewSource,它绑定到一个自定义ObservableDictionary,其格式为:

ObservableDictionary<int, List<Waypoint>>

航点实例的格式为:

public class Waypoint
{
    public string Name { get; set; }
    public float X { get; set; }
    public float Y { get; set; }
    public float Z { get; set; }
}

在同一个视图模型中,我有另一个属性&#39; MapId&#39;随着玩家在地图之间移动而更新。我试图将此ObservableDictionary实例绑定到ListBox,以仅显示基于其mapid的给定地图的路线图。 (字典的int是地图ID。)

有没有办法让CollectionViewSource根据正在更新的另一个属性绑定强制刷新?

我试图在XAML中尽可能少地使用代码进行此操作。

以下是我目前的一些内容。

在我看来:

<CollectionViewSource x:Key="WaypointCollection" Filter="WaypointCollection_OnFilter" Source="{Binding Waypoints, Source={StaticResource Configurations}}" 
                      />

在我看来代码隐藏(过滤器):

    private void WaypointCollection_OnFilter(object sender, FilterEventArgs e)
    {
        var main = SimpleIoc.Default.GetInstance<MainViewModel>();
        if (main == null)
        {
            e.Accepted = false;
            return;
        }

        var waypoint = (KeyValuePair<int, List<Waypoint>>)e.Item;
        var zone = main.Player.ZoneId;
        e.Accepted = waypoint.Key == zone;
    }

2 个答案:

答案 0 :(得分:0)

你无法绑定。因为它们不是DependencyObject(DO)。但是如果这个another property是DO / DP。然后,您可以使用Refresh方法强制刷新。您可以指定一个回调,以便在注册DP时收到有关此DP的任何更改的通知。

... , new PropertyMetadata(new PropertyChangedCallback(MyCallback));

答案 1 :(得分:0)

我使用创建服务来处理根据需要通过异步任务加载的东西。尽管不是我最初想要的方法,但仍可按需要工作。