首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF ICollectionView双向绑定?

WPF ICollectionView双向绑定?
EN

Stack Overflow用户
提问于 2016-08-27 10:18:21
回答 2查看 787关注 0票数 0

我在DataGrid中显示一些数据,绑定到CollectionView。绑定工作正常,但似乎是只读的:检查网格中的复选框不会更新模型。

减少和荒诞:

代码语言:javascript
复制
public class Item
{
    public bool IsChecked
    {
        get
        {
            return _isChecked;
        }
        set
        {
            // Not hit when clicking on checkbox
            _isChecked = value;
        }
    }
    private bool _isChecked;
}

后面的代码,我的集合视图是一个依赖项属性:

代码语言:javascript
复制
        private static DependencyProperty __CollectionViewProperty = DependencyProperty.Register
        (
           "_CollectionView",
           typeof( ICollectionView ),
           typeof( MyClass ),
           new PropertyMetadata( null )
        );

        private ICollectionView _CollectionView
        {
            get { return ( ICollectionView )GetValue( __CollectionViewProperty ); }
            set { SetValue( __CollectionViewProperty, value ); }
        }

并且实例化如下:

代码语言:javascript
复制
List<Item> items = new List<Item>();
items.Add( new Item() );
this._CollectionView = CollectionViewSource.GetDefaultView( items );

在xaml中,我只需将DataGrid绑定到_CollectionView,将复选框绑定到IsChecked。没有异常,IsChecked的状态在UI中得到了正确的反映。

但是,单击复选框只更新UI,而不是更新模型。我是WPF的新手,来自Cocoa,那里的等价物是NSArrayController,而绑定可以直接从盒子里走出来。我遗漏了什么?

编辑: xml代码:

代码语言:javascript
复制
<DataGrid Grid.Row="1" ItemsSource="{ Binding _CollectionView}" AutoGenerateColumns="False" GridLinesVisibility="None"
                  RowHeight="60" ScrollViewer.VerticalScrollBarVisibility="Hidden" ScrollViewer.HorizontalScrollBarVisibility="Hidden"
                  CanUserReorderColumns="False" CanUserResizeColumns="False" CanUserSortColumns="True" IsSynchronizedWithCurrentItem="True"
                  x:Name="_DataGrid">
            <DataGrid.Columns>
                <DataGridTemplateColumn Header="" Width="90" CanUserSort="False">
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <CheckBox IsChecked="{Binding IsChecked}" Click="CheckBox_Click" HorizontalAlignment="Left"/>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            <DataGrid.Columns>
</DataGrid>
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-08-27 18:40:35

好的,明白了。

由于一些愚蠢的原因,在绑定到集合时,默认的绑定模式是OneWay,而UpdateSourceTrigger不是PropertyChanged。文档提到绑定是一种方式,但更新触发器也不一样.

因此,xaml绑定变成:

代码语言:javascript
复制
<CheckBox IsChecked="{Binding IsChecked, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>

要使对源的更改正确传播到目标UI组件,最简单的方法是从DependencyObject继承,并将相关属性声明为依赖项属性:

代码语言:javascript
复制
public class Item : DependencyObject
{
        private static DependencyProperty __IsCheckedProperty = DependencyProperty.Register
        (
           "IsChecked",
           typeof( bool ),
           typeof( iOSAppItem ),
           new PropertyMetadata( true )
        );

        public bool IsChecked
        {
            get { return ( bool )GetValue( __IsCheckedProperty ); }
            set { SetValue( __IsCheckedProperty, value ); }
        }
}

根据文档,使用DependencyProperty也是最有效率

最后,选择ObservableCollection而不是列表是个好主意:项目的插入/删除将免费同步。

票数 0
EN

Stack Overflow用户

发布于 2016-08-27 10:33:18

您是否尝试在类上实现INotifyPropertyChanged并像这样定义IsChecked属性:

代码语言:javascript
复制
 public virtual bool IsChecked
    {
        get
        { return _isChecked; }
        set
        {
            if (_isChecked != value)
            {
                _isChecked = value;
                OnPropertyChanged("IsChecked");
            }
        }
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39179997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档