WPF datagrid分组问题

X-i-n 2017-12-25 04:38:32
我想在DataGrid里以分组的形式展示一个SQL的查询结果,在XAML里为DataGrid创建了所有的Column并且设置了Bind,在查询完以后,把DataTable的DefaultView作为数据源绑定到ItemsSource,可以正常显示。
结果在做分组的时候碰到一点不理解的地方,麻烦朋友们能帮忙解一下惑。
在List<MyItem>上创建ListCollectionView,然后添加GroupDescriptions,并把DataGrid.ItemsSource变更到这个ListCollectionView上,结果运行以后,所有单元格全为空(DataGrid的AutoGenerateColumns为False,在XAML里每个字段手工创建Column);如果把AutoGenerateColumns设置为True,可以正常自动创建所有字段(包括我不想展示到DataGrid里的),手工创建的Column还是为空。
现在不明白的是这几个问题,还请大家指教,谢谢:
为什么手工创建的字段以ListCollectionView做数据源的时候不能根据绑定获取到值呢(DataView正常)?
当一个对象有若干个字段不想展示,但是不得不用到,这种情况怎么处理呢?等它自动生成了字段以后再隐藏吗?
...全文
292 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
X-i-n 2017-12-25
  • 打赏
  • 举报
回复
引用 4 楼 zhuo_wp 的回复:
给你一个demo
    public class EnumToTextConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            TestEnum te = (TestEnum)value;
            if(te == TestEnum.Test1)
            {
                return "This is Test1";
            }
            else if (te == TestEnum.Test2)
            {
                return "This is Test2";
            }
            else if (te == TestEnum.Test3)
            {
                return "This is Test3";
            }
            else if (te == TestEnum.Test4)
            {
                return "This is Test4";
            }
            return "Null";
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            if(value == null)
            {
                return TestEnum.Null;
            }

            string text = value.ToString();
            if(text == "This is Test1")
            {
                return TestEnum.Test1;
            }
            else if(text == "This is Test2")
            {
                return TestEnum.Test2;
            }
            else if (text == "This is Test3")
            {
                return TestEnum.Test3;
            }
            else if (text == "This is Test4")
            {
                return TestEnum.Test4;
            }
            else
            {
                return TestEnum.Null;
            }

        }
    }
<Window x:Class="WpfApp3.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfApp3"
        mc:Ignorable="d"
        Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <local:EnumToTextConverter x:Key="etc"/>
    </Window.Resources>
    <Grid>
        <TextBox Text="{Binding TestEnum,Converter={StaticResource etc}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
    </Grid>
</Window>
    /// <summary>
    /// MainWindow.xaml 的交互逻辑
    /// </summary>
    public partial class MainWindow : Window
    {
        public event PropertyChangedEventHandler PropertyChanged;


        public MainWindow()
        {
            InitializeComponent();
            DataContext = new ViewModel();
        }
    }
    public enum TestEnum : int
    {
        Null = 0,
        Test1 = 1,
        Test2 = 2, 
        Test3 = 3,
        Test4 = 4,
    }
    public class ViewModel : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private TestEnum _testEnum = TestEnum.Test1;

        public TestEnum TestEnum
        {
            get => _testEnum;
            set
            {
                _testEnum = value;
                PropertyChanged(this, new PropertyChangedEventArgs("TestEnum"));
            }
        }
    }
非常感谢,我学习一下。
zhuowp 2017-12-25
  • 打赏
  • 举报
回复
引用
当一个对象有若干个字段不想展示,但是不得不用到,这种情况怎么处理呢?等它自动生成了字段以后再隐藏吗?
这个是可以自己创建特定的列,然后用绑定的方式展示出你想要的属性。网上很多相关的例子。 http://blog.csdn.net/sanjiawan/article/details/6785394
zhuowp 2017-12-25
  • 打赏
  • 举报
回复
给你一个demo

    public class EnumToTextConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
TestEnum te = (TestEnum)value;
if(te == TestEnum.Test1)
{
return "This is Test1";
}
else if (te == TestEnum.Test2)
{
return "This is Test2";
}
else if (te == TestEnum.Test3)
{
return "This is Test3";
}
else if (te == TestEnum.Test4)
{
return "This is Test4";
}
return "Null";
}

public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if(value == null)
{
return TestEnum.Null;
}

string text = value.ToString();
if(text == "This is Test1")
{
return TestEnum.Test1;
}
else if(text == "This is Test2")
{
return TestEnum.Test2;
}
else if (text == "This is Test3")
{
return TestEnum.Test3;
}
else if (text == "This is Test4")
{
return TestEnum.Test4;
}
else
{
return TestEnum.Null;
}

}
}


<Window x:Class="WpfApp3.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp3"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Window.Resources>
<local:EnumToTextConverter x:Key="etc"/>
</Window.Resources>
<Grid>
<TextBox Text="{Binding TestEnum,Converter={StaticResource etc}, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>
</Window>


    /// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public event PropertyChangedEventHandler PropertyChanged;


public MainWindow()
{
InitializeComponent();
DataContext = new ViewModel();
}
}


    public enum TestEnum : int
{
Null = 0,
Test1 = 1,
Test2 = 2,
Test3 = 3,
Test4 = 4,
}


    public class ViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private TestEnum _testEnum = TestEnum.Test1;

public TestEnum TestEnum
{
get => _testEnum;
set
{
_testEnum = value;
PropertyChanged(this, new PropertyChangedEventArgs("TestEnum"));
}
}
}
zhuowp 2017-12-25
  • 打赏
  • 举报
回复
引用 1 楼 Runnerchin 的回复:
还有一个情况,不知道怎么处理才好。 比如有一个字段是枚举,0,1,2,3代表不同的状态。显示的时候用DataTrigger按数值去显示不同的文本,但如果想要让当用户编辑这个字段的时候,应该是什么样的流程去做呢?
用IValueConverter,将枚举值转换成文本,不要像你这样用Trigger
X-i-n 2017-12-25
  • 打赏
  • 举报
回复
数据不显示的问题已经解决了,数据源从DataTable改到ListCollectionView的时候,绑定的字段名没有跟着换到属性名,实在是太大意了。 不过另两个问题还是完全没有头绪,因为这个对象有些属性是自定义的类(比如属性A是一个User对象,属性B是一个自定义的Log类的数组),最终显示出来会变成类型名,要怎么做才会显示成真正的值呢?
X-i-n 2017-12-25
  • 打赏
  • 举报
回复
还有一个情况,不知道怎么处理才好。 比如有一个字段是枚举,0,1,2,3代表不同的状态。显示的时候用DataTrigger按数值去显示不同的文本,但如果想要让当用户编辑这个字段的时候,应该是什么样的流程去做呢?

110,545

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧