将 wpf 列表框绑定到组合框

发布于 2024-10-10 07:13:33 字数 2717 浏览 1 评论 0原文

我创建了一个非常基本的 wpf 应用程序,我想用它来记录不同项目的时间条目。 我还没有为此使用 mvvm,因为我认为它有点过分了。

我有一个包含组合框和列表框的表单。我创建了一个像这样的基本实体模型 alt text

我想做的是将组合框绑定到项目,每当我从组合框中选择一个项目时,它就会更新包含与该项目关联的可用任务的列表视图。

到目前为止,这是我的 xaml。我后面没有任何代码,因为我只需单击“数据”菜单,然后单击“数据源”并将项目拖放到上方。应用程序加载正常并且组合框已填充,但列表框中没有显示任何内容。

谁能告诉我我错过了什么?

    <Window.Resources>
    <CollectionViewSource x:Key="tasksViewSource" d:DesignSource="{d:DesignInstance l:Task, CreateList=True}" />
    <CollectionViewSource x:Key="projectsViewSource" d:DesignSource="{d:DesignInstance l:Project, CreateList=True}" />
</Window.Resources>
<Grid DataContext="{StaticResource tasksViewSource}">
    <l:NotificationAreaIcon 
                  Text="Time Management" 
                  Icon="Resources\NotificationAreaIcon.ico"
                  MouseDoubleClick="OnNotificationAreaIconDoubleClick">
        <l:NotificationAreaIcon.MenuItems>
            <forms:MenuItem Text="Open" Click="OnMenuItemOpenClick" DefaultItem="True" />
            <forms:MenuItem Text="-" />
            <forms:MenuItem Text="Exit" Click="OnMenuItemExitClick" />
        </l:NotificationAreaIcon.MenuItems>
    </l:NotificationAreaIcon>
    <Button Content="Insert" Height="23" HorizontalAlignment="Left" Margin="150,223,0,0" Name="btnInsert" VerticalAlignment="Top" Width="46" Click="btnInsert_Click" />
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="70,16,0,0" Name="comProjects" VerticalAlignment="Top" Width="177" DisplayMemberPath="Project1" ItemsSource="{Binding Source={StaticResource projectsViewSource}}" SelectedValuePath="ProjectID" />
    <Label Content="Projects" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" IsEnabled="False" />
    <Label Content="Tasks" Height="28" HorizontalAlignment="Left" Margin="16,61,0,0" Name="label2" VerticalAlignment="Top" />
    <ListBox Height="112" HorizontalAlignment="Left" Margin="16,87,0,0" Name="lstTasks" VerticalAlignment="Top" Width="231" DisplayMemberPath="Task1" ItemsSource="{Binding Path=ProjectID, Source=comProjects}" SelectedValuePath="TaskID" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="101,224,0,0" Name="txtMinutes" VerticalAlignment="Top" Width="42" />
    <Label Content="Mins to Insert" Height="28" HorizontalAlignment="Left" Margin="12,224,0,0" Name="label3" VerticalAlignment="Top" />
    <Button Content="None" Height="23" HorizontalAlignment="Left" Margin="203,223,0,0" Name="btnNone" VerticalAlignment="Top" Width="44" />
</Grid>

I have created a very basic wpf application that I want to use to record time entries against different projects.
I havent used mvvm for this as I think its an overkill.

I have a form that contains a combobox and a listbox. I have created a basic entity model like this
alt text

What I am trying to do is bind the combobox to Project and whenever I select an item from the combobox it updates the listview with the available tasks associated with that project.

This is my xaml so far. I dont have any code behind as I have simply clicked on that Data menu and then datasources and dragged and dropped the items over. The application loads ok and the combobox is been populated however nothing is displaying in the listbox.

Can anyone tell me what I have missed?

    <Window.Resources>
    <CollectionViewSource x:Key="tasksViewSource" d:DesignSource="{d:DesignInstance l:Task, CreateList=True}" />
    <CollectionViewSource x:Key="projectsViewSource" d:DesignSource="{d:DesignInstance l:Project, CreateList=True}" />
</Window.Resources>
<Grid DataContext="{StaticResource tasksViewSource}">
    <l:NotificationAreaIcon 
                  Text="Time Management" 
                  Icon="Resources\NotificationAreaIcon.ico"
                  MouseDoubleClick="OnNotificationAreaIconDoubleClick">
        <l:NotificationAreaIcon.MenuItems>
            <forms:MenuItem Text="Open" Click="OnMenuItemOpenClick" DefaultItem="True" />
            <forms:MenuItem Text="-" />
            <forms:MenuItem Text="Exit" Click="OnMenuItemExitClick" />
        </l:NotificationAreaIcon.MenuItems>
    </l:NotificationAreaIcon>
    <Button Content="Insert" Height="23" HorizontalAlignment="Left" Margin="150,223,0,0" Name="btnInsert" VerticalAlignment="Top" Width="46" Click="btnInsert_Click" />
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="70,16,0,0" Name="comProjects" VerticalAlignment="Top" Width="177" DisplayMemberPath="Project1" ItemsSource="{Binding Source={StaticResource projectsViewSource}}" SelectedValuePath="ProjectID" />
    <Label Content="Projects" Height="28" HorizontalAlignment="Left" Margin="12,12,0,0" Name="label1" VerticalAlignment="Top" IsEnabled="False" />
    <Label Content="Tasks" Height="28" HorizontalAlignment="Left" Margin="16,61,0,0" Name="label2" VerticalAlignment="Top" />
    <ListBox Height="112" HorizontalAlignment="Left" Margin="16,87,0,0" Name="lstTasks" VerticalAlignment="Top" Width="231" DisplayMemberPath="Task1" ItemsSource="{Binding Path=ProjectID, Source=comProjects}" SelectedValuePath="TaskID" />
    <TextBox Height="23" HorizontalAlignment="Left" Margin="101,224,0,0" Name="txtMinutes" VerticalAlignment="Top" Width="42" />
    <Label Content="Mins to Insert" Height="28" HorizontalAlignment="Left" Margin="12,224,0,0" Name="label3" VerticalAlignment="Top" />
    <Button Content="None" Height="23" HorizontalAlignment="Left" Margin="203,223,0,0" Name="btnNone" VerticalAlignment="Top" Width="44" />
</Grid>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

茶花眉 2024-10-17 07:13:33

您在网格中设置了 DataContext,因此只需更改您的 ItemsSource,如下所示。

<Grid DataContext="{StaticResource tasksViewSource}"> 
  <ListBox Height="112"  
           HorizontalAlignment="Left"  
           Margin="16,87,0,0"  
           Name="lstTasks"  
           VerticalAlignment="Top"  
           Width="231"  
           DisplayMemberPath="Task1"  
           ItemsSource="{Binding}"  
           SelectedValuePath="TaskID" />  
 </Grid>

您还需要过滤任务列表,为此只需更改生成的代码即可。
这是我一起编写的一个例子。
您可以使用组合框中的 SelectionChanged 事件来切换该值。

private System.Data.Objects.ObjectQuery<Models.Task> GetTasksQuery(Models.StackoverflowEntities stackoverflowEntities)
{
  // get the selected item
  int id = (int)cboProjects.SelectedValue;
  System.Data.Objects.ObjectQuery<CollectionViewSourceEF.Models.Task> tasksQuery = stackoverflowEntities.Tasks.Where(task => task.ProjectID == id) as ObjectQuery<Task>;
  return tasksQuery;
}

You set the DataContext in the Grid, so just change your ItemsSource as indicated below.

<Grid DataContext="{StaticResource tasksViewSource}"> 
  <ListBox Height="112"  
           HorizontalAlignment="Left"  
           Margin="16,87,0,0"  
           Name="lstTasks"  
           VerticalAlignment="Top"  
           Width="231"  
           DisplayMemberPath="Task1"  
           ItemsSource="{Binding}"  
           SelectedValuePath="TaskID" />  
 </Grid>

You'll also want to filter the task list, to do that just change the generated code.
Here is an example I hacked together.
You can toggle the value using the SelectionChanged event from your ComboBox.

private System.Data.Objects.ObjectQuery<Models.Task> GetTasksQuery(Models.StackoverflowEntities stackoverflowEntities)
{
  // get the selected item
  int id = (int)cboProjects.SelectedValue;
  System.Data.Objects.ObjectQuery<CollectionViewSourceEF.Models.Task> tasksQuery = stackoverflowEntities.Tasks.Where(task => task.ProjectID == id) as ObjectQuery<Task>;
  return tasksQuery;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文