代码之家  ›  专栏  ›  技术社区  ›  Tigraine

winforms中wpf主机中的数据绑定错误?

  •  1
  • Tigraine  · 技术社区  · 15 年前

    我花了太多时间在这上面,找不到错误。也许我遗漏了一些非常明显的东西,或者我可能刚刚在winforms的wpf元素宿主中发现了一个bug。

    我正在将ListView绑定到我的ProductListViewModel上的ObeServableList。

    我正试图实现对ListView的搜索,一般的想法是用一个过滤后的新列表来更改ObservableList。

    总之,ListView绑定代码如下所示:

    <ListView ItemsSource="{Binding Path=Products}" SelectedItem="{Binding Path=SelectedItem}" SelectionMode="Single">
        <ListView.ItemContainerStyle>
            <Style TargetType="{x:Type ListViewItem}">
                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}"></Setter>
            </Style>
        </ListView.ItemContainerStyle>
        <ListView.ItemTemplate>
            <DataTemplate>
                <TextBlock Text="{Binding Name}"></TextBlock>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
    

    VIEWModel代码非常普通:

    private ObservableCollection<ProductViewModel> products;
    public ObservableCollection<ProductViewModel> Products
    {
        get { return products; }
        private set
        {
            if (products != value)
            {
                products = value;
                OnPropertyChanged("Products");
            }
        }
    }
    

    现在这里的问题是:一旦我调试了我的onPropertyChanged方法,我可以看到没有对propertyChanged事件的订阅服务器(它是空的),所以在UI上什么也没有发生。 我已经尝试了模式=twoway和其他绑定模式,似乎我无法让ListView订阅itemssource…

    有人能帮我吗?我只是想忘记elemenhost,然后用winforms做它。

    你好,丹尼尔

    1 回复  |  直到 15 年前
        1
  •  1
  •   Julien Lebosquain    15 年前

    输出窗口中有绑定错误吗?

    顺便说一下,您应该考虑让集合视图包装您的产品,然后过滤视图,而不是替换整个集合。

    代码应该是这样的:

    var collectionView = CollectionViewSource.GetDefaultView(Products);
    collectionView.Filter += item => ...;