两个列表框,基于条件MVVM对项目进行分组

时间:2014-07-22 18:38:56

标签: c# wpf mvvm listbox

我以熟悉的方式设置了两个这样的列表框:

<ListBox HorizontalAlignment="Left" Margin="78,35,0,-32" Grid.Row="1" Width="300" ItemsSource="{Binding ListOfItems}" Grid.RowSpan="3" >
                    <ListBox.ItemTemplate>
                        <DataTemplate>
                            <StackPanel>
                                <TextBlock Text="{Binding Number}" />
                                <TextBlock Text="{Binding Date, StringFormat={}{0:MM/dd/yy}}" />
                            </StackPanel>
                        </DataTemplate>
                    </ListBox.ItemTemplate>
                </ListBox>

一个列表框用于非过期日期,它是相应的,另一个列表框用于过期日期,它是相应的数字。

我想知道如何调整条件或属性以正确绑定,以便属性仅在满足条件时绑定。

我已经尝试了下面的条件,但是所有日期(无论是否过期或未绑定到第一个列表框)或我的属性都没有正确绑定。

我想看一个关于如何设置它的例子。

以下是我的视图模型中的条件示例。

ListInformation tempList = new ListInformation();

if (DateTime.Compare(Date, DateTime.Now) > 0)
{
    Date = tempList.Date;
    Number = tempList.Number; 
}
else if (DateTime.Compare(Date, DateTime.Now) < 0)
{
    Exp_Date = tempList.Date;
    Exp_Number = tempList.Number; 
}

编辑:

所以,这是我目前的设置。

我有一个xml文件,当用户点击导入按钮时会被读取。我有一个类/模型,它从xml中删除所有关键项并将它们保存到数据库中。我只想在我的视图中将该xml文件中的数字和日期显示到我的列表框中。在我看来,我有两个列表框...一个用于非过期日期,它是一个数字,一个用于过期日期和它的数字。

2 个答案:

答案 0 :(得分:1)

我认为它应该足够简单。

创建两个列表:

List<YourType> ListExpiry = new List<YourType>();
List<YourType> ListNonExpiry = new List<YourType>();

然后根据日期添加项目:

ListExpiry = YourSource.Where(x => x.Date > DateTime.Now).Select(x => x)ToList();
ListNonExpiry = YourSource.Where(x => x.Date < DateTime.Now).Select(x => x)ToList();

注意:

  1. YourType应替换为DataType。
  2. YourSource应替换为数据来源。
  3. 在XAML中:

    对于First ListBox:

    ItemsSource="{Binding ListExpiry}"
    

    对于第二个ListBox:

    ItemsSource="{Binding ListNonExpiry}"
    

    更新:

    在MainViewModel中:

    public static List<YourType> ListExpiry = new List<YourType>();
    public static List<YourType> ListNonExpiry = new List<YourType>();
    

    您想要设置值的位置(称之为):

    MainViewModel.ListExpiry = .....
    MainViewModel.ListNonExpiry = .....
    

    在App.xaml文件中:

    <yourNamespacePrefix:MainViewModel x:Key="MainViewModelResource" />
    

    e.g。

    <Self:MainWindowViewModel x:Key="mainWindowViewModel" />
    

    您还需要在XAML文件中更改dataContext,如:

    <Window ............. DataContext="{StaticResource MainViewModelResource}" />
    

答案 1 :(得分:0)

取决于您的日期集合的填充方式。

我会创建两个集合并分别绑定它们。在getter中添加你的条件......

public ICollection<listType> ExpiredDates{ get { return from p in source where p.Date < DateTime.Now select;}}

然后,当您的日期被填充时,无论如何,请在这些属性上调用PropertyChanged以通知视图更新。您可能还需要一个占位符集方法。

OnPropertyChanged("ExpiredDates");

借口代码质量,iPad在编码时很糟糕。