【问题标题】:How do I access elements in a WPF popup?如何访问 WPF 弹出窗口中的元素?
【发布时间】:2017-04-26 10:22:49
【问题描述】:

我想根据某些条件更改弹出窗口中按钮的颜色,并且我想根据这些条件设置一些文本。我需要在后面的代码中执行此操作。

我在 StackPanel 中有一个包含多个 TextBlock 的弹出窗口。前 3 个绑定到课程的详细信息(这是一个日程安排应用程序;学校项目)。最后一个我想是空的,除非有关于那门课程的冲突。也就是说,我想动态决定每次打开弹出窗口时 TextBlock 中的内容(如果有的话)。

    <Popup Name="CourseListDetail" Width="Auto" Height="Auto">
            <StackPanel>
                <TextBlock Margin="10,10,10,0">
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}{0}: {1}">
                            <Binding Path="CourseCode"/>
                            <Binding Path="LongTitle"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
                <TextBlock Margin="10,0,10,0">
                    <TextBlock.Text>
                        <MultiBinding StringFormat="{}{0} - {1}/{2}">
                            <Binding Path="ProfessorsString"/>
                            <Binding Path="Enrollment"/>
                            <Binding Path="Capacity"/>
                        </MultiBinding>
                    </TextBlock.Text>
                </TextBlock>
                <TextBlock Margin="10,0,10,0" Grid.Row="2" Grid.Column="1" Text="{Binding MeetingsString}" TextWrapping="Wrap"
                           HorizontalAlignment="Center"/>
                <TextBlock TextWrapping="WrapWithOverflow"  MaxWidth="300" Text="{Binding Description}" Margin="10,10,10,10"/>
                <TextBlock Name="ConflictText" Foreground="Red" HorizontalAlignment="Center" Text="{Binding ConflictString}"/>
                <Button Name="Detail_AddCourse" Content="Add To Schedule" Margin="10,10,10,10" Padding="5" Background="LightGreen"
                        Click="AddCourseButton_Click"
                        Style="{StaticResource MyButtonStyle}"/>
            </StackPanel>
        </Border>
    </Popup>

我有一个功能,当您单击课程时会打开弹出窗口,并为弹出窗口提供有关课程的 DataContext,但我不知道如何通过该功能访问 TextBlock 或其下方的按钮.我想会有一个子属性或其他东西,所以我可以调用按钮,比如:

CourseListDetail.Detail_AddCourse.Background = "Red";

CourseListDetail.Child.Button().Background = "Red";

等等

函数背后的代码:

    private void CourseListItem_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
    {
        ListViewItem selection = sender as ListViewItem;
        Course course = selection.DataContext as Course;

        CourseListDetail.DataContext = course;
        CourseListDetail.PlacementTarget = selection;
        CourseListDetail.IsOpen = true;
        CourseListDetail.Focus();

        hasConflict conflictType = _schedule.HasConflict(course);
        if (conflictType != hasConflict.NO_CONFLICT) {     //If there is a conflict
            //Change button color to red here

            if (conflictType == hasConflict.COURSE_FULL) { //If the course is full
                //Set TextBlock text to conflict message here
            }
        }
        else { //No conflict
            //Set button color to green
        }
    } 

hasConflict 只是一个枚举

【问题讨论】:

  • 你为什么不使用一些属性并将它们绑定到颜色或其他任何东西?
  • 正确的答案是一如既往地直接操作弹出元素。您的弹出窗口应该由视图模型在代码中表示,包含您想要控制的属性,并根据需要绑定到弹出属性。然后,您只需更改视图模型中的属性,它们就会自动反映在弹出窗口本身中。
  • 这是我第一次使用 WPF。我刚开始为这个项目学习它,我们在 Sprint 2 上。我真的不知道如何做你们中的任何一个人的建议,甚至你的建议。
  • 您应该首先查看有关在 WPF 中使用 MVVM 的可用教程。要在 Stack Overflow 上提问,您应该先阅读 minimal reproducible exampleHow to Ask。请务必阅读后一页底部链接的文章。
  • 我不知道这些教程的存在,谢谢你通知我彼得。我发现我的问题的解决方案是我很愚蠢,所以这总是很好。编辑:也就是说,我总是能够编辑这些元素,只是不像我假设的那样。

标签: c# wpf data-binding


【解决方案1】:

使用 x:Name 代替 Name。然后您将能够访问后面代码中的元素。请参阅In WPF, what are the differences between the x:Name and Name attributes? 了解说明。

【讨论】:

  • 正如您引用的问题的答案所解释的那样,Name 属性映射到x:Name,并会在适当的情况下生成该字段(例如,如果元素位于模板,因为在这种情况下没有元素的实际单个实例)。您的答案实际上如何修复 OP 的代码?你测试了吗?您是否确认它解决了他们的问题?
  • 它通过允许访问后面代码中弹出窗口中的按钮来修复 OP 的代码。确实我测试过。确实我已经验证过了。 OP关于模板的问题没有任何内容。我解释的弹出窗口是在窗口中定义的。无需为每个列表项设置单独的弹出窗口。
  • 我很惊讶您能够在 OP 代码的上下文中测试您的提案。因为他们没有提供实际的minimal reproducible example 进行测试。而且我仍然看不到,鉴于在这种情况下,Namex:Name 都会在代码隐藏中生成一个字段,您使用后者而不是前者的建议如何解决这个问题。
  • 确实,也许 OP 应该提供更多代码。因此,我不得不对弹出窗口的实现方式做出一些假设。但这并不会削弱我的回答很可能会解决他的问题的事实。你为什么要为这件事痛打我?你为什么不写一些代码来证明我的答案有效?
  • “这并没有削弱我的回答很可能会解决他的问题这一事实”——这很奇怪,因为使用 Name 之间没有区别并使用x:Name。你的回答如何解决他的问题? “你为什么要为此痛打我?”——对不起,我的本意不是让你感到“被打”。我的意图是确保发布的答案有用并解决问题。我看不出你的怎么可能达到这个标准。 “你为什么不写一些代码来证明我的答案行不通?”——因为原始问题没有足够的上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
  • 2023-01-20
  • 2012-07-15
相关资源
最近更新 更多