【发布时间】: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 example 和 How to Ask。请务必阅读后一页底部链接的文章。
-
我不知道这些教程的存在,谢谢你通知我彼得。我发现我的问题的解决方案是我很愚蠢,所以这总是很好。编辑:也就是说,我总是能够编辑这些元素,只是不像我假设的那样。
标签: c# wpf data-binding