首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >CollectionViewSource的问题

CollectionViewSource的问题
EN

Stack Overflow用户
提问于 2015-07-10 20:45:05
回答 1查看 124关注 0票数 0

我这里有个小问题:

在我的代码中,我有一个包含一些项的ObservableCollection:

代码语言:javascript
复制
myCalenderItems = new ObservableCollection<CalendarItem>();

为了对列表进行排序,我创建了一个CollectionViewSource,并在后面的代码中将其绑定到一个数据网格:

代码语言:javascript
复制
 ICollectionView mySortedCalenderItems = CollectionViewSource.GetDefaultView(myCalenderItems);

  mySortedCalenderItems.SortDescriptions.Add(new SortDescription("Day", ListSortDirection.Ascending));
  mySortedCalenderItems.SortDescriptions.Add(new SortDescription("Time", ListSortDirection.Ascending));

  MainGrid.DataContext = mySortedCalenderItems;
  CalendarDataGrid.ItemsSource = mySortedCalenderItems;

Datagrid的XAML如下所示:

代码语言:javascript
复制
 <DataGrid Name="CalendarDataGrid" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" CanUserSortColumns="False">
            <DataGrid.Columns>
                <DataGridComboBoxColumn Header="Day" ItemsSource="{Binding Source={StaticResource WeekDayEnum}}" Width="*" SelectedValueBinding="{Binding Day, Mode=TwoWay}"/>
                <DataGridTextColumn Header="Time" Binding="{Binding Time}" Width="*" IsReadOnly="False"/>
                <DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*" IsReadOnly="False"/>
            </DataGrid.Columns>
            <DataGrid.GroupStyle>
                <GroupStyle ContainerStyle="{StaticResource GroupHeaderStyle}">
                    <GroupStyle.Panel>
                        <ItemsPanelTemplate>
                            <DataGridRowsPresenter/>
                        </ItemsPanelTemplate>
                    </GroupStyle.Panel>
                </GroupStyle>
            </DataGrid.GroupStyle>
        </DataGrid>

此外,我还希望能够使用数据网格之外的其他控件来编辑值,例如

代码语言:javascript
复制
<ComboBox Text="{Binding Path=Day}" IsSynchronizedWithCurrentItem="True"/>

这就是我的问题所在。当在datagrid中更改日期时,排序起作用,但是当通过combobox控件更改它时,它确实会在datagrid中更改,但不会重新排序。(更改修改前项目的另一个属性时进行重新排序)

你知道这里出了什么问题吗?

问候

PS:整个XAML

代码语言:javascript
复制
<UserControl
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
         xmlns:System="clr-namespace:System;assembly=mscorlib"
         xmlns:local="clr-namespace:MyProject" 
         mc:Ignorable="d" 
         d:DesignHeight="520" d:DesignWidth="840">

<UserControl.Resources>
    <ObjectDataProvider x:Key="WeekDayEnum" MethodName="GetValues"
                    ObjectType="{x:Type System:Enum}">
        <ObjectDataProvider.MethodParameters>
            <x:Type TypeName="local:WeekDay"/>
        </ObjectDataProvider.MethodParameters>
    </ObjectDataProvider>
</UserControl.Resources>

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*"/>
        <RowDefinition Height="*"/>
    </Grid.RowDefinitions>

    <Grid x:Name="MainGrid" Grid.Row="0">
        <Grid.RowDefinitions>
            <RowDefinition Height="30"/>
            <RowDefinition Height="*"/>
            <RowDefinition Height="30"/>
        </Grid.RowDefinitions>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="100"/>
            <ColumnDefinition Width="240"/>
            <ColumnDefinition Width="180"/>
        </Grid.ColumnDefinitions>

        <Label Grid.Row="0" Grid.Column="0" Content="Weekly" HorizontalAlignment="Left" VerticalAlignment="Center"/>
        <DataGrid x:Name="CalendarDataGrid" Grid.Row="1" Grid.Column="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" ItemsSource="{Binding}" IsSynchronizedWithCurrentItem="True" AutoGenerateColumns="False" CanUserSortColumns="False">
            <DataGrid.Columns>
                <DataGridComboBoxColumn Header="Day" ItemsSource="{Binding Source={StaticResource WeekDayEnum}}" Width="*" SelectedValueBinding="{Binding Day, Mode=TwoWay}"  />
                <DataGridTextColumn Header="Time" Binding="{Binding Time}" Width="*" IsReadOnly="False"/>
                <DataGridTextColumn Header="Value" Binding="{Binding Value}" Width="*" IsReadOnly="False"/>
            </DataGrid.Columns>
        </DataGrid>

        <Grid Grid.Row="1" Grid.Column="2">
            <Grid.RowDefinitions>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="*"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="70"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>

            <Label Grid.Row="0" Content="Day" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="20,0,0,0"/>
            <Label Grid.Row="1" Content="Time" HorizontalAlignment="Left"  VerticalAlignment="Center" Margin="20,0,0,0"/>
            <Label Grid.Row="2" Content="Value" HorizontalAlignment="Left"  VerticalAlignment="Center" Margin="20,0,0,0"/>

            <ComboBox Grid.Row="0" Grid.Column="1" HorizontalAlignment="Right"  VerticalAlignment="Center" Width="100" Text="{Binding Path=Day}"  IsSynchronizedWithCurrentItem="True"/>
            <TextBox Grid.Row="1"  Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Width="100" Text="{Binding Path=Time, Mode=TwoWay}"/>
            <TextBox Grid.Row="2" Grid.Column="1" HorizontalAlignment="Left" VerticalAlignment="Center" Height="23" TextWrapping="Wrap"  Width="100" Text="{Binding Path=Value, Mode=TwoWay}"/>

        </Grid>
    </Grid>
</Grid>

EN

回答 1

Stack Overflow用户

发布于 2015-07-12 10:48:22

XAML中的combobox代码设置不正确。要正常工作,您需要设置SelectedValue属性。(这可能需要稍微调整一下,但它给了您一个想法)。

代码语言:javascript
复制
<ComboBox ItemsSource="{Binding Source={StaticResource WeekDayEnum}}" 
                       SelectedValue="{Binding Path=Day, Mode=TwoWay}" />

让我给出一个组合框更改另一个组合框的示例。

例如,我有这样的数据类型:

代码语言:javascript
复制
public class PriceItem
{
    public string Name { get; set; }
    public int Price { get; set; }
}

下面是值的数据列表,它在我的VM上保存为Items

代码语言:javascript
复制
Items = new List<PriceItem>()
{
    new PriceItem() { Name = "Alpha", Price=100 },
    new PriceItem() { Name = "Beta",  Price=200 },
};

Scenario两个组合框,都绑定到Items数据。一个组合框在其下拉框中显示Name,而另一个组合框显示PriceName组合框控制价格组合框,当它改变价格组合框时,价格也会发生变化。

代码语言:javascript
复制
<ComboBox x:Name="comboName" ItemsSource="{Binding Items}" DisplayMemberPath="Name" />
<ComboBox x:Name="comboValue"
          ItemsSource="{Binding Items}"
          DisplayMemberPath="Price"
          SelectedValuePath="Price"
          SelectedValue="{Binding SelectedItem.Price, ElementName=comboName, Mode=OneWay}"/>

实际上,两个组合框都是空白的。但每当我选择第一个时,它就会改变第二个。全部使用相同的数据/数据对象。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31341137

复制
相关文章

相似问题

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