我这里有个小问题:
在我的代码中,我有一个包含一些项的ObservableCollection:
myCalenderItems = new ObservableCollection<CalendarItem>();为了对列表进行排序,我创建了一个CollectionViewSource,并在后面的代码中将其绑定到一个数据网格:
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如下所示:
<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>此外,我还希望能够使用数据网格之外的其他控件来编辑值,例如
<ComboBox Text="{Binding Path=Day}" IsSynchronizedWithCurrentItem="True"/>这就是我的问题所在。当在datagrid中更改日期时,排序起作用,但是当通过combobox控件更改它时,它确实会在datagrid中更改,但不会重新排序。(更改修改前项目的另一个属性时进行重新排序)
你知道这里出了什么问题吗?
问候
PS:整个XAML
<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>
发布于 2015-07-12 10:48:22
XAML中的combobox代码设置不正确。要正常工作,您需要设置SelectedValue属性。(这可能需要稍微调整一下,但它给了您一个想法)。
<ComboBox ItemsSource="{Binding Source={StaticResource WeekDayEnum}}"
SelectedValue="{Binding Path=Day, Mode=TwoWay}" />让我给出一个组合框更改另一个组合框的示例。
例如,我有这样的数据类型:
public class PriceItem
{
public string Name { get; set; }
public int Price { get; set; }
}下面是值的数据列表,它在我的VM上保存为Items。
Items = new List<PriceItem>()
{
new PriceItem() { Name = "Alpha", Price=100 },
new PriceItem() { Name = "Beta", Price=200 },
};Scenario两个组合框,都绑定到Items数据。一个组合框在其下拉框中显示Name,而另一个组合框显示Price。Name组合框控制价格组合框,当它改变价格组合框时,价格也会发生变化。
<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}"/>实际上,两个组合框都是空白的。但每当我选择第一个时,它就会改变第二个。全部使用相同的数据/数据对象。

https://stackoverflow.com/questions/31341137
复制相似问题