【问题标题】:how to bind the value of property of treeview's column in wpf如何在wpf中绑定treeview列的属性值
【发布时间】:2017-05-27 17:50:10
【问题描述】:

这是我的 XAML 的一部分:

    <Grid>
                <dxg:TreeListControl x:Name="HierarchyTreeControl" ItemsSource="{Binding MenuItems}" EnableSmartColumnsGeneration="False" HorizontalAlignment="Left" Margin="0" VerticalAlignment="Top" SelectionMode="Row" AutoGenerateColumns="None">
                    <dx:TreeListColumn FieldName="Name" Header="Title" Width="50" />
                    <dx:TreeListColumn FieldName="URL" Header="Link" Width="150" />             
                    <dx:TreeListColumn Binding="{Binding HasChildren}" Header="Has any children" Width="20" BestFitArea="Header" AllowResizing="False" ShowInColumnChooser="True" Visible="True" >
                        <dx:TreeListColumn.EditSettings>
                            <dxe:CheckEditSettings />
                        </dx:TreeListColumn.EditSettings>
                    </dx:TreeListColumn>
                    <dx:TreeListColumn Binding="{Binding IsChecked}" Header="Удалить" ReadOnly="False" AllowEditing="{Binding Path=HasChildren, Converter={StaticResource BoolToFalseConverter}, UpdateSourceTrigger=PropertyChanged}" Width="20" BestFitArea="Header" AllowResizing="False" ShowInColumnChooser="True" Visible="True" >
                        <dx:TreeListColumn.EditSettings>
                            <dxe:CheckEditSettings />
                        </dx:TreeListColumn.EditSettings>
                    </dx:TreeListColumn>
                    <dxg:TreeListControl.View>
                        <dxg:TreeListView AllowPerPixelScrolling="True" ShowTotalSummary="False" KeyFieldName="ID" ParentFieldName="ParentID"  TreeDerivationMode="Selfreference" AllowEditing="False" AutoExpandAllNodes="False" FetchSublevelChildrenOnExpand="False" AllowColumnMoving="False" AutoWidth="True" ShowNodeImages="False" />
                    </dxg:TreeListControl.View>
                </dxg:TreeListControl>
            </Grid>

来源 {MenuItems} 是 ObservableCollection&lt;MenuItem&gt;

我希望仅当属性 MenuItem.HasChildren = false 时才允许检查最后一列中的复选框

我正在尝试使用此代码:

AllowEditing="{绑定路径=HasChildren, Converter={StaticResource BoolToFalseConverter},UpdateSourceTrigger=PropertyChanged}"

但这不起作用,我看到转换器 BoolToFalseConverter 只调用一次,第一行

如何完成任务?

更新: 这是MenuItem的类

public class MenuItem : INotifyPropertyChanged
    {
        private int _id;
        public int ID
        {
            get {return _id;}
            set
            {
                if (_id == value)
                    return;
                _id = value;
                OnPropertyChanged("ID");
            }
        }

        private string _name;
        public string Name
        {
            get{return _name;}
            set
            {
                if (_name == value)
                    return;
                _name = value;
                OnPropertyChanged("Name");
            }
        }

        private string _url;
        public string URL
        {
            get
            {
                return _url;
            }
            set
            {
                if (_url == value)
                    return;
                _url = value;
                OnPropertyChanged("URL");
            }
        }

        private int _target;
        public int Target
        {
            get{return _target;}
            set
            {
                if (_target == value)
                    return;
                _target = value;
                OnPropertyChanged("Target");
            }
        }
        private int? _parentID;
        public int? ParentID
        {
            get{return _parentID;}
            set
            {
                if ((_parentID == null && value == null) || _parentID == value)
                    return;
                _parentID = value;
                OnPropertyChanged("ParentID");
            }
        }

        public bool HasChildren { get; set; }

        private bool _isChecked;
        public bool IsChecked
        {
            get{return _isChecked;}
            set
            {
                if (_isChecked == value)
                    return;
                _isChecked = value;
                OnPropertyChanged("IsChecked");
            }
        }

        protected void OnPropertyChanged(string propertyName)
        {
            if (PropertyChanged != null)
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }

【问题讨论】:

    标签: c# wpf data-binding treeview


    【解决方案1】:

    我假设 HasChildren 是指“查看”孩子。在这种情况下,您需要一个专用的转换器(或更好的行为)来发布事件。视图模型将订阅该事件,一旦收到它就会将 HasChildren 的值设置为 true 或 false 并通知 Is Checked 属性以通知视图。

    如果 HasChildren 与视图模型对象相关,那么它只是一种简单地检查视图模型并通知视图的方式。

    来自 cmets 的更新:

    我在 DevExpress 论坛上发现了这个问题,它与您的问题完全一致 => devexpress.com/Support/Center/Question/Details/Q367068 他们说您应该使用 TreeListView.ShowingEditor 事件,当您调用该事件时,您可以设置启用或禁用特定单元格的编辑

    【讨论】:

    • HasChildren 以某种方式获得了它的价值,我根据您的评论猜测它来自一个字段。我建议将属性 HasChildren 更改为 get & internal set,这样它就不会从类外部更改,然后在“set”方法中更新 IsChecked 的值。
    • 我不想更新 HasChildren 属性。我的想法是根据树视图中每一行的 HasChildren 值更改复选框的 AllowEditing 属性。
    • 只是上面代码更新的一个修复:您的属性 HasChildren 不是只读的,它根本没有后端字段。给它一个后端字段不会以任何方式改变它的行为。回到你的问题 - 我在 DevExpress 论坛中发现了这个问题,它与你的问题完全相关 => devexpress.com/Support/Center/Question/Details/Q367068 他们说你应该使用 TreeListView.ShowingEditor 事件,当你调用它时,你可以设置启用或禁用特定的编辑细胞。
    • 非常感谢!您到 DevExpress 论坛的链接救了我!希望我可以将您的评论标记为答案!
    • @Beingbigone 不要忘记将答案标记为正确的
    猜你喜欢
    • 2013-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-29
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    相关资源
    最近更新 更多