【问题标题】:Custom Datagrid OnKeyDown check IsEnabled Items自定义 Datagrid OnKeyDown 检查 IsEnabled 项
【发布时间】:2017-08-24 03:45:08
【问题描述】:

我有一个包含静态数据的数据网格,其中两个项目被禁用。唯一的问题是 Silverlight 在使用箭头键浏览数据网格项目时,禁用的项目也会关注。

我创建了一个自定义数据网格类并在 XAML 中引用它,然后在使用 OnKeyDown 事件时我检查 IsEnabled True 或 False。但到目前为止它没有得到正确的值,我认为这是因为我在哪里设置了 IsEnabled 状态我引用了默认的 Datagrid 类?

自定义数据网格

public class CustomGrid : DataGrid
    {
        protected override void OnKeyDown(KeyEventArgs e)
        {
            if(IsEnabled != false)
                base.OnKeyDown(e);
        }
    }

Xaml

  <UserControl.Resources>
        <Style x:Key="DataGridStyle1" TargetType="local:CustomGrid">
            <Setter Property="RowStyle">
                <Setter.Value>
                    <Style TargetType="sdk:DataGridRow">
                        <Setter Property="IsEnabled" Value="{Binding enabled}"/> //CheckIsEnabled Value
                    </Style>
                </Setter.Value>
            </Setter>...

<local:CustomGrid x:Name="McDataGrid" HorizontalAlignment="Left" Height="500" VerticalAlignment="Top" Width="400" Style="{StaticResource DataGridStyle1}"/>

列出数据

 private List<Model> Data()
        {
            list.Add(new Model(1, "Test", "1", true));
            list.Add(new Model(2, "Ger", "2", true));
            list.Add(new Model(3, "dsg", "3", true));
            list.Add(new Model(4, "Hd", "4", false));
            list.Add(new Model(5, "TeHRFdgst", "5", false));
            return list;
        }

        public class Model : INotifyPropertyChanged
        {
            public bool _enabled;
            public int Id { get; set; }
            public string Name { get; set; }
            public string Prop { get; set; }
            public bool enabled
            {
                get { return _enabled; }

                set
                {
                    _enabled = value;
                    OnPropertyChanged("enabled");
                }
            }

            public event PropertyChangedEventHandler PropertyChanged;

            public Model(int id, string name, string prop, bool isenabled)
            {
                Id = id;
                Name = name;
                Prop = prop;
                enabled = isenabled;

            }

            protected virtual void OnPropertyChanged(string propertyName)
            {
                PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
            }
        }

当我用"local:CustomGrid" 更改这个&lt;Style TargetType="sdk:DataGridRow"&gt; 部分时,我的整个网格只是空白不知道为什么。

有没有关于如何完成这个或其他方法的建议?

【问题讨论】:

    标签: c# wpf xaml silverlight datagrid


    【解决方案1】:

    试试这样的:

    public class CustomGrid : DataGrid
    {
        private List<Model> models;
        public CustomGrid()
        {
            Loaded += (s,e) => models = ItemsSource as List<Model>;
        }
    
        protected override void OnKeyDown(KeyEventArgs e)
        {
            if (models == null)
                return;
    
            Model model = CurrentItem as Model;
            if (model == null)
                return;
    
            int index = models.IndexOf(model);
            switch (e.Key)
            {
                case Key.Down:
                    //is the next model disabled?
                    if (index < models.Count - 1 && !models[index + 1].enabled)
                        e.Handled = true;
                    break;
                case Key.Up:
                    if (index > 0 && !models[index - 1].enabled)
                        e.Handled = true;
                    break;
            }
        }
    }
    

    XAML:

    <UserControl ...>
        <UserControl.Resources>
            <Style x:Key="DataGridStyle1" TargetType="local:CustomGrid">
                <Setter Property="RowStyle">
                    <Setter.Value>
                        <Style TargetType="sdk:DataGridRow">
                            <Setter Property="IsEnabled" Value="{Binding enabled}"/>
                        </Style>
                    </Setter.Value>
                </Setter>
            </Style>
        </UserControl.Resources>
    
        <Grid x:Name="LayoutRoot" Background="White">
            <local:CustomGrid x:Name="McDataGrid" Style="{StaticResource DataGridStyle1}" />
        </Grid>
    </UserControl>
    

    【讨论】:

    • 谢谢 我认为修复将基于 Xaml 但非常简单。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    相关资源
    最近更新 更多