有没有可能刷新ICollectionView属性上的getter?

时间:2016-05-24 19:59:29

标签: c# wpf

我正在开发一个自动填充文本框,其中包含一个列表框,该列表框将根据用户输入的内容从数据库中填充街道名称。当我的应用程序启动时,我的属性上的getter返回null,因为用户尚未在文本框中键入任何内容。我想要完成的是在从api呼叫返回街道后以某种方式刷新吸气剂。我的二传手中也有一个OnPropertyChanged似乎无法正常工作。有什么建议?谢谢。

public ICollectionView Streets
{
    get { return streets; }

    set
    {
            streets = value;                   
            OnPropertyChanged("Streets");
            Streets.Refresh();                
    }                    
}

这里的街道被添加到列表中(效果非常好):

public void AddToList()
{
    var streetNames = new ObservableCollection<Street>();                              
    {
        streetNames.Add(new Street() { StreetName = "Mockingbird Ln" });
        streetNames.Add(new Street() { StreetName = "Shoeman Ln" });
        streetNames.Add(new Street() { StreetName = "Gingerbread Drive" });
        foreach (var street in StreetNames)
        {
            streetNames.Add(new Street() {StreetName = street});
        }

    };
    streets = CollectionViewSource.GetDefaultView(streetNames);
    streets.Filter = ContainsFilter;

}

Listbox Xaml:

<ListBox x:Name="StreetListBox"  Visibility="Collapsed" Background="White" Margin="138,548,35,381"   
    ItemsSource="{Binding Path=Streets, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay, NotifyOnSourceUpdated=True, NotifyOnTargetUpdated=True}"
    SelectedItem="{Binding Path=SelectedStreet}">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="{x:Type System:String}">
            <StackPanel>
                <TextBlock Text="{Binding Path=StreetName}"></TextBlock>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

1 个答案:

答案 0 :(得分:0)

您需要在ViewModel上实现INotifyPropertyChanged接口。如果你没有,PropertyChanged事件不会被你的观众收听,那么它就不会打电话给你的吸气者。

我在您的代码中看到的其他问题是在XAML DataType="{x:Type System:String}"中,这是错误的。您的数据类型为Street,因此您的XAML应如下所示:

<ListBox.ItemTemplate>
    <DataTemplate DataType="{x:Type local:Street}">
        <StackPanel>
            <TextBlock Text="{Binding Path=StreetName}" />
        </StackPanel>
    </DataTemplate>
</ListBox.ItemTemplate>