天道酬勤,学无止境

如何使用数据绑定更改 XAML 文件的样式?(How can I change styles of XAML file using Data Binding?)

问题

我正在将一组对象绑定到 WPF 中的列表框,为简单起见,我们将说我正在绑定的对象具有 3 个属性:名称、URL、IsBold。 我想要做的是,如果 IsBold 设置为 true,则显示不同,再次作为示例,我想将出现 Name 的 TextBlock 设置为粗体。 这样的事情甚至可能吗? 如果我的一个属性是某个值,我可以使用不同的样式或其他东西吗? (我可以在 XAML 中执行类似 if/else 的操作吗)? 我真的不知道从哪里开始。

假设我的 DataTemplate 中有这个

<TextBlock Style="{StaticResource notBold}" Text="{Binding Path=Name}"></TextBlock>

如果 IsBold 为该特定项目设置为 true 我希望它是(注意样式从“notBold”更改为“isBold”)

<TextBlock Style="{StaticResource isBold}" Text="{Binding Path=Name}"></TextBlock>

或者类似的东西。 我想更普遍的问题。 是否可以根据数据绑定的项目更改某些内容的外观? 如果这是不可能的,如何做这样的事情? 通过代码隐藏不知何故?

谢谢

回答1

您通常会为列表中的对象编写一个 DataTemplate,然后让 DataTrigger 根据 IsBold 属性设置 TextBlock/TextBox 的 Fontweight。

<DataTemplate DataType="DataItem">
    <TextBlock x:Name="tb" Text="{Binding Name}"/>
    <DataTemplate.Triggers>
        <DataTrigger Binding="{Binding IsBold}" Value="true">
            <Setter TargetName="tb" Property="FontWeight" Value="Bold" />
        </DataTrigger>
        <DataTrigger Binding="{Binding IsBold}" Value="false">
            <Setter TargetName="tb" Property="FontWeight" Value="Normal" />
        </DataTrigger>
    </DataTemplate.Triggers>
</DataTemplate>

然后将 DataItems 列表设置为 ComboBox 的 ItemsSource 属性(通过数据绑定或直接在myComboBox.ItemsSource=myDataItems的代码隐藏中)。 其余的由 WPF 为您完成。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何动态更改我从中获取图像的资源文件夹?(How do I dynamically change which Resource folder I get an image from?)
    问题 我正在尝试为 WPF 应用程序实现 2 个不同的主题。 我发现了@bendewey 的这篇出色的帖子:“WPF 主题可以用于为一个可以在运行时更改的应用程序包含多个皮肤吗?” 并用它来实现两个主题。 我创建了两个资源文件夹,让我们将它们称为 ResourcesTheme1 和 ResourcesTheme2 以及具有样式的两个 Xaml 资源字典文件(Style1.xaml 和 Style2.xaml)。 有了这个,我已经能够设置以下样式:在 Style1.xaml <Style x:Key="HomeViewBackGroundImage" TargetType="Image"> <Setter Property="Source" Value="/ResourcesTheme1/Background.png" /> </Style> 在 Style2.xaml 中 <Style x:Key="HomeViewBackGroundImage" TargetType="Image"> <Setter Property="Source" Value="/ResourcesTheme2/Background.png" /> </Style> 这对我来说是一种享受(如果有更好的方法,请随时提出建议)。 不,我遇到的问题是,在我的 mainPage xaml 中,我想放置一行按钮
  • 如何轻松地允许用户更新 XAML (UWP) 中使用的元素样式(How to easily allow users to update Styles used be elements in XAML (UWP))
    问题 这适用于 Windows 10 UWP。 我需要允许用户更新与整个应用程序中使用的元素相关联的样式的值(即允许用户更改各种文本块的字体大小、背景颜色堆栈面板等)。 我目前将所有样式都放在一个单独的文件中。 我的App.xaml如下: <Application x:Class="MyTestApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/Styles/Styles.xaml"/> </ResourceDictionary.MergedDictionaries> </ResourceDictionary> </Application.Resources> </Application> 我的Styles.xaml (部分)如下: <ResourceDictionary xmlns="http://schemas.microsoft.com
  • 如何将 xaml 中的数据触发器绑定到代码定义的依赖项属性?(How do I bind a datatrigger in xaml to a code-defined dependency property?)
    问题 我的窗口代码定义了一个依赖属性,“活动”...... public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } public bool Active { get { return (bool) GetValue(ActiveProperty); } set { SetValue(ActiveProperty, value); } } public static readonly DependencyProperty ActiveProperty = DependencyProperty.Register("Active", typeof(bool), typeof(MainWindow), new UIPropertyMetadata(false)); } 然后我使用 xaml 中的两个复选框绑定到该属性。 我还想根据该属性更改矩形的填充。 我怎样才能使这项工作? <Window x:Class="WpfTest.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx
  • 如何将数据绑定到 UWP 中 RichEditBox 的纯文本值?(How can I databind to the plain-text value of a RichEditBox in UWP?)
    问题 使用 UWP 中的普通TextBox ,您可以将数据绑定到Text属性,并轻松地从 ViewModel 获取或设置值。 RichEditBox 没有数据绑定的Text属性; 相反,您必须使用Document属性公开的 ITextDocument 接口并使用各种方法来获取和设置文本。 如何将纯文本数据绑定到 ViewModel 中的某些内容? 回答1 可以使用自定义附加属性对RichEditBox的纯文本进行数据绑定。 此附加属性处理文档的富文本和纯文本之间的转换。 这是一个示例 XAML 页面、代码隐藏和显示附加属性用法的 ViewModel: XAML 将此复制为项目中新页面的内容 <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <StackPanel Margin="30"> <RichEditBox local:RichEditBoxExtension.PlainText="{Binding PlainText, Mode=TwoWay}" x:Name="richedit"/> <Button Content="Bold selection" Click="MakeBold"/> <Button Content="Change plain text (view model)
  • WPF,XAML:如何使用对ListBox ItemsSource对象的属性进行绑定来设置ListBoxItem的样式?(WPF, XAML: How to style a ListBoxItem using binding on property of ListBox ItemsSource object?)
    问题 我有一个绑定到LogMessages的ObservableCollection的ListBox。 public ObservableCollection<LogMessage> LogMessages { get; set; } public LogMessageData() { this.LogMessages = new ObservableCollection<LogMessage>(); } 每个消息都有两个参数: public class LogMessage { public string Msg { get; set; } public int Severity { get; set; } //code cut... } ListBox充满了这些Item,我需要根据LogMessage项目的Severity参数对列表进行颜色编码(更改ListBoxItem的背景色)。 这是我现在在用户控件的XAML中显示日志的内容: <UserControl.Resources> <AlternationConverter x:Key="BackgroundSeverityConverter"> <SolidColorBrush>Green</SolidColorBrush> <SolidColorBrush>Yellow</SolidColorBrush>
  • 如何继承XAML样式并覆盖子元素的属性?(How to inherit XAML style and override property of child element?)
    问题 我们刚开始使用XAML,但仍在解决基本问题:从CSS入手,我们想使用自定义控件模板定义通用按钮样式,然后让第二种样式使用“ basedon”继承第一种样式的所有内容。然后应覆盖属性,例如“前景颜色”(有效),但还要覆盖我们自定义模板中子元素的属性,例如所包含的边框元素等的“背景颜色”(不起作用)。 处理这种事情的一般方法是什么? 级联样式可以走多远? 干杯! 回答1 您可以使用没有键引用的继承样式: <Grid> <Grid.Resources> <!-- Definition of default appearance of a button --> <Style TargetType="Button" x:Key="Default"> <Setter Property="Background" Value="Red"></Setter> <Setter Property="FontFamily" Value="Segoe Black" /> <Setter Property="HorizontalAlignment" Value="Center" /> <Setter Property="FontSize" Value="32pt" /> <Setter Property="Foreground" Value="#777777" /> </Style> <!--
  • 如何设置 TabControls TabItem 标题 FontSize(How do I set TabControls TabItem header FontSize)
    问题 我有一个 TabControl,其样式可以更改 TabItem 标题的 FontSize。 当我数据绑定 ItemsSource 时,只有标题受 FontSize 影响。 但是当我在另一个 TabControl 上使用相同的样式并在 XAML 中添加 TabItems 时,TabItem 中所有内容的 FontSize 都会更改。 我希望该样式适用于数据绑定和非数据绑定 TabItem。 <TabControl Style="{StaticResource VariablesTabControl}" ItemsSource="{Binding TabItems}"> ... </TabControl> MainSkin.xaml: <Style TargetType="TabControl" x:Key="VariablesTabControl"> <Setter Property="ItemContainerStyle" Value="{StaticResource VariableTabItem}" /> ... </Style> <Style TargetType="TabItem" x:Key="VariableTabItem"> <Setter Property="Template"> <Setter.Value> <ControlTemplate
  • DataGrid Cell.Style 绑定(DataGrid Cell.Style binding)
    问题 我有 WPF DataGrid (.net 4.0) 的性能问题 首先,一些细节: 我有一个带有 Observable 集合的数据网格作为 ItemsSource。 这个 observableCollection 本身包含对象的集合,因此每个集合都是一行,每个对象都是一个单元格(当然是“逻辑”单元格,而不是实际的 dataGridCell) 我这样做的原因是因为我只在运行时知道我的数据网格中有多少列。 然后我将每个 DataGridCell 的值绑定到“逻辑”表中对象的值(= 集合的集合) 现在我遇到的麻烦是,我还必须能够在应用程序运行时随时更改任何单元格的属性(如背景、前景、FontFamily 等)。 我想出的解决方案是使用绑定到“逻辑”单元格属性的绑定来设置列的单元格样式 这是一个示例代码(我的应用程序中没有 Xaml): public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); Width = 1200; Height = 780; Top = 60; Left = 200; DataGrid dg = new DataGrid(); Content = dg; ObservableCollection<Row> Source = new
  • 如何在WPF不从Aero转换为Classic的情况下更改按钮的默认样式?(How do I alter the default style of a button without WPF reverting from Aero to Classic?)
    问题 我已经将PresentationFramework.Aero添加到我的App.xaml合并字典中,如... <Application x:Class="TestApp.App" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Application.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="/PresentationFramework.Aero;component/themes/Aero.NormalColor.xaml" /> <ResourceDictionary Source="pack://application:,,,/WPFToolkit;component/Themes/Aero.NormalColor.xaml" /> <ResourceDictionary Source="/CommonLibraryWpf;component/ResourceDictionaries
  • 可可与微软Qt相比如何?(How does Cocoa compare to Microsoft, Qt?)
    问题 我已经用Qt(仅以编程方式构建的GUI)进行了几个月的开发,现在开始使用Cocoa。 我不得不说,我爱可可。 在Qt中看起来很困难的很多事情对于Cocoa都是容易的。 Obj-C似乎比C ++复杂得多。 可能只有我一个人,所以:你对此有何看法? 与Qt相比,可可粉与WPF(那是正确的框架?)相比如何? Obj-C与C#和C ++相比如何? XCode / Interface Builder与Visual Studio和Qt Creator相比如何? 文档如何比较? 例如,我发现可可的插座/动作比Qt的信号和插槽要有用得多,因为它们似乎涵盖了大多数GUI交互,而我不得不在一半的时间内解决信号/插槽。 (我只是用错了吗?) 同样,XCode的标准模板实际上免费提供给我复制/粘贴,撤消/重做,保存/打开以及许多其他功能,而这些在Qt中是相当复杂的任务。 请仅在您至少具有这些开发环境/框架/语言中的至少两个的实际知识的情况下回答。 回答1 多年来,我一直在与Cocoa / Obj-C合作。 截至2010年,我发现与WPF / NET Framework相比,它具有很大的局限性。 我将列出一些我发现的差异,您可以自己判断。 标记语言 在WPF中进行设计时,会得到非常简单的XML标记,可以使用自己编写的工具轻松进行手工编辑或编辑。 在Cocoa中,我必须使用xib文件
  • 如何更改MahApps.Metro对话框内容模板的宽度?(How to change MahApps.Metro dialog content template width?)
    问题 我想更改MahApps.Metro对话框的基本模板(或创建新的对话框类型),因为我想在狭窄的登录窗口中显示它们。 现在,消息中的几乎所有第二个单词都在新行中,但是左右两侧都有很大的空格,我想减少这些空格。 我在BaseMetroDialog.xaml中发现,消息对话框在垂直方向上分为三部分:左侧25%的空间,内容50%的空间和右侧25%的空间。 我想更改这些数字。 但是,如何用我的新模板更改BaseMetroWindow的控件模板? 回答1 只需创建自己的样式即可覆盖对话框Template (并添加DialogShownStoryboard )。 <Style TargetType="{x:Type Dialog:BaseMetroDialog}" x:Key="NewCustomDialogStyle" BasedOn="{StaticResource {x:Type Dialog:BaseMetroDialog}}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type Dialog:BaseMetroDialog}"> <ControlTemplate.Resources> <Storyboard x:Key="DialogShownStoryboard">
  • 在WPF中将Shape转换为可重用的Geometry(Convert Shape into reusable Geometry in WPF)
    问题 我正在尝试将System.Windows.Shapes.Shape对象转换为System.Windows.Media.Geometry对象。 对于Geometry对象,我将根据一组数据点使用自定义图形控件多次渲染它。 这要求Geometry对象的每个实例都有一个唯一的TranslateTransform对象。 现在,我以两种不同的方式处理此问题,但似乎都无法正常工作。 我的自定义控件使用以下代码来绘制几何图形: //Create an instance of the geometry the shape uses. Geometry geo = DataPointShape.RenderedGeometry.Clone(); //Apply transformation. TranslateTransform translation = new TranslateTransform(dataPoint.X, dataPoint.Y); geo.Transform = translation; //Create pen and draw geometry. Pen shapePen = new Pen(DataPointShape.Stroke, DataPointShape.StrokeThickness); dc.DrawGeometry(DataPointShape
  • WPF XAML 更改某些元素的样式模板属性(WPF XAML Change Style Template Property for Some Elements)
    问题 在 WPF 应用程序中,我有一个用于按钮的样式: <Style TargetType="Button" x:Key="ButtonEllipse"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="Button"> <StackPanel Orientation="Vertical"> <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Margin="0 0 0 10"/> <Image x:Name="ButtonImage" HorizontalAlignment="Center" VerticalAlignment="Center" Stretch="None" Source="/MyProject;component/Images/ButtonEllipse.png"/> </StackPanel> </ControlTemplate> </Setter.Value> </Setter> </Style> 对于大多数按钮都可以,但对于一个特定实例,我想使用相同的模板,但将图像更改为 ButtonEllipseNew.png(这是视图模型属性的值)。 按钮定义如下:
  • WPF基于数据类型设置样式?(WPF Setting style based on datatype?)
    问题 这就是问题所在。 我正在将 TreeView 与几种不同类型的对象绑定。 每个对象都是一个节点,有些对象有一个名为 IsNodeExpanded 的属性,当然,有些对象没有。 这是我的风格: <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsExpanded" Value="{Binding IsNodeExpanded, Mode=TwoWay}" /> </Style> 现在,问题是在绑定不具有此属性的项目时,我们在输出中收到此错误: System.Windows.Data Error: 39 : BindingExpression path error: 'IsNodeExpanded' property not found on 'object' ''CompensationChannel' (HashCode=56992474)'. BindingExpression:Path=IsNodeExpanded; DataItem='CompensationChannel' (HashCode=56992474); target element is 'TreeViewItem' (Name=''); target property is 'IsExpanded' (type 'Boolean'
  • 如何在 C# 中动态更改网格子文本块的字体大小?(How to change the font size of a grid's children text blocks dynamically in c#?)
    问题 在 Microsoft Visual Studio 中使用 c# 的 Windows Phone 8.1 WinRT 应用程序中,使用以下代码,如何在后面的代码中动态更改网格子文本块的字体大小? <Grid Name="mainGrid"> <Grid.Resources> <Style TargetType="TextBlock"> <Setter Property="Margin" Value="5"/> <Setter Property="FontSize" Value="12"/> </Style> </Grid.Resources> </Grid> 这个想法是让用户在选项屏幕中更改字体大小,然后将其保存到本地设置,然后更改显示以匹配字体大小。 加载应用程序时会动态添加网格的子文本块,我不是在问如何从 ApplicationData.Current.LocalSettings 加载值。 我也知道样式和设置器还没有任何名称,如果需要可以填写。 如果可能,我想避免使用资源字典和数据绑定。 有人可以提供一个简单的代码示例以在后面的代码中使用来更改字体大小吗? 回答1 这是我以前动态更改样式的方式,但是会涉及到资源字典。 private void changeSzie_Click(object sender, RoutedEventArgs e) { var
  • 使用背景色更改 TextBlock 前景色(Change TextBlock foreground color using background color)
    问题 在我的 WPF 应用程序中,我必须根据用户条件不断更新 TextBlock 背景。 TextBlock 样式在 App.xaml 中定义。 如果背景太暗(绿色/蓝色),我想将前景设置为白色,否则为黑色。 我怎样才能做到这一点? 我探索了以下两个选项: 通过 DataTriggers:在 App.xaml 中: <Style TargetType="TextBlock"> <Setter Property="FontSize" Value="14"/> <Setter Property="FontStyle" Value="Normal"/> <Style.Triggers> <DataTrigger Binding="{Binding RelativeSource={RelativeSource Self},Path=Background,PresentationTraceSources.TraceLevel=High}" Value="White"> <Setter Property="Foreground" Value="Maroon"/> </DataTrigger> </Style.Triggers> </Style> 这似乎不起作用。 我从未在 textblock 的前景属性中看到更新。 在调试时,我看到以下绑定:<<<<<<<<<<<<<<<<<<<<<<<<<<
  • 如何在 C#/XAML Windows 应用商店(Metro UI)应用程序中混合明暗主题?(How do I mix Light and Dark themes in a C#/XAML Windows Store (Metro UI) App?)
    问题 根据 MSDN,设置应用程序主题的标准方法是在顶级Application实例上设置RequestedTheme="Dark"或RequestedTheme="Light" 。 这对于简单的应用程序非常有用,但很多时候我发现自己想要更改单个页面甚至单个控件的主题(例如,同一应用程序中的浅色主题文本编辑页面与深色主题图像查看器)。 XAML 控件有 10 或 100 种视觉状态和颜色定义,手动设置它们中的每一种都很乏味且难以 100% 正确! 有没有一种简单的方法可以在单个控件上设置深色或浅色主题? 回答1 对于 XAML Windows 商店应用程序,控件的默认外观在Common/StandardStyles.xaml定义。 如果你曾经看过那个文件,你会注意到大量的引用,比如{StaticResource ApplicationForegroundThemeBrush} 。 看起来很有希望... 不幸的是,这些“主题画笔”并未在您的应用程序中的任何地方定义,并且没有简单的方法可以为单个控件设置明暗覆盖。 然而,有一个答案。 幸运的是,Joe White 有一篇关于默认主题颜色的优秀博客文章,我已将其转换为资源字典,您可以在此处找到。 Dropbox 只进行 xml 预览,因此您必须重命名文件。 但是,将这些资源复制到您的应用程序本身无济于事。 要使用它们
  • 如何从 xaml 访问 UserControl 内的按钮?(How do I Access Buttons inside a UserControl from xaml?)
    问题 在工作中,我有几个页面,每个页面在相同的位置都有按钮,并且具有相同的属性。 每个页面也有细微差别。 为此,我们创建了一个 userControl 模板并将所有按钮放入其中,然后将该用户控件应用于所有页面。 但是,现在很难访问按钮并从每个页面的 xaml 修改它们,因为它们位于页面上的 UserControl 内.....我如何优雅地访问每个页面的按钮? 我试过的: 目前,我们绑定到一堆依赖属性。 我不喜欢这个选项,因为我有很多按钮,并且需要控制这些按钮上的很多属性。 结果是数以百计的依赖属性,当我们需要改变某些东西时,这真是一团糟。 另一种方法是使用样式。 我一般喜欢这种方法,但是因为这些按钮在另一个控件中,所以修改它们变得很困难,并且模板一次只适合一个按钮。 Adam Kemp 发表了关于让用户在这里插入他们自己的按钮的帖子,这是我目前正在尝试实现/修改的方法。 不幸的是,我无权访问 Xamarin。 虽然代码运行时的模板插入,模板无法正确更新的按钮。 如果我在 MyButton Setter 中放置一个断点,我可以看到该值实际上是一个空按钮,而不是我在主窗口中分配的那个。 我该如何解决? 这是一些简化的代码: 我的模板 UserControl 的 xaml: <UserControl x:Class="TemplateCode.Template" x:Name=
  • 当文本框处于焦点时更改容器的背景颜色(changing background color of container when textbox is in focus)
    问题 我有一个带有TextBox的简单用户TextBox 。 我想在TextBox获得焦点时更改用户控件的颜色。 这就是我所拥有的: <UserControl x:Class="OutLookContactList.ContactSearchControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Name="root" MinHeight="30" Loaded="UserControl_Loaded"> <UserControl.Resources> <Style x:Key="searchTextBoxStyle" TargetType="{x:Type TextBox}"> <Style.Triggers> <Trigger Property="IsFocused" Value="true"> <Setter TargetName="root" Property="Background" Value="{StaticResource OnMouseOverColor}" /> </Trigger> </Style.Triggers> </Style> <
  • 更改列表框中最后一项的样式(Change style of last item in ListBox)
    问题 我有包含颜色列表的列表框控件。 这是代码和图像: <ListBox Name="FillSelections" VerticalContentAlignment="Stretch" HorizontalContentAlignment="Center" SelectedItem="{Binding SelectedColor}" SelectionMode="Single" Style="{StaticResource HorizontalListBoxStyle}" ItemsSource="{Binding FillColors}" ItemTemplate="{StaticResource ColorsItemTemplate}"></ListBox> <DataTemplate x:Key="ColorsItemTemplate"> <Border BorderBrush="Transparent"> <Rectangle Width="20" StrokeThickness="1" Stroke="Black"> <Rectangle.Fill> <SolidColorBrush Color="{Binding}" /> </Rectangle.Fill> </Rectangle> </Border> 图片: 我将如何仅像这样更改最后一项的样式: 回答1