天道酬勤,学无止境

WPF 样式的绑定(Binding for WPF Styles)

问题

我正在尝试创建一个自定义控件 - 一个按钮 - 它将根据数据上下文中的属性值应用多种样式。

我在想的是使用类似的东西:

<Button Style="{Binding Path=ButtonStyleProperty, Converter={StaticResource styleConverter}}" Text="{Binding Path=TextProp}" />

在代码中...实现一个 IValueConverter,它在ConvertTo方法中执行类似于以下代码的操作:

switch(value as ValueEnums)
{
    case ValueEnums.Enum1:
        FindResource("Enum1ButtonStyle") as Style;
    break;

    ... and so on.
} 

但是我不完全确定如何拉出样式对象,即使这是可能的......

同时我正在做的是处理DataContextChanged事件,然后将处理程序附加到绑定到按钮的对象的PropertyChanged事件 - 然后在那里运行 switch 语句。

它不是很完美,但在我找到更好的解决方案之前,这似乎是我必须使用的。

回答1

如果您想替换整个样式(而不仅仅是它的元素),那么您可能会将这些样式存储在资源中。 您应该能够执行以下操作:

<Button>
    <Button.Style>
        <MultiBinding Converter="{StaticResource StyleConverter}">
            <MultiBinding.Bindings>
                <Binding RelativeSource="{RelativeSource Self}"/>
                <Binding Path="MyStyleString"/>
            </MultiBinding.Bindings>
        </MultiBinding>
    </Button.Style>
</Button>

通过使用 MultiBinding 并使用 Self 作为第一个绑定,我们可以在转换器中查找资源。 转换器需要实现 IMultiValueConverter(而不是 IValueConverter)并且看起来像这样:

class StyleConverter : IMultiValueConverter 
{
    public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        FrameworkElement targetElement = values[0] as FrameworkElement; 
        string styleName = values[1] as string;

        if (styleName == null)
            return null;

        Style newStyle = (Style)targetElement.TryFindResource(styleName);

        if (newStyle == null)
            newStyle = (Style)targetElement.TryFindResource("MyDefaultStyleName");

        return newStyle;
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

这不是我经常做的事情,但应该从记忆中工作:)

回答2

看来您需要使用 DataTrigger 类。 它允许您根据按钮的内容将不同的样式应用于按钮。

例如,以下样式将根据数据上下文对象的属性值将按钮的背景属性更改为红色

<Style x:Key="ButtonStyle" TargetType="{x:Type Button}">
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path="Some property"}" 
                     Value="some property value">
            <Setter Property="Background" Value="Red"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
回答3

对于我们这些不能使用多值转换器的人(我在看 SL4 和 WP7 :),感谢 Steven 的回答,我找到了使用普通值转换器的方法。

唯一的假设是样式值包含在正在设置的样式的属性中。

因此,如果您使用的是 MVVM 模式,则假定样式值(例如 TextSmall、TextMedium、TextLarge)是视图模型的一部分,您所要做的就是传递定义样式名称的转换器参数。

例如,假设您的视图模型具有属性:

public string ProjectNameStyle
{
    get { return string.Format("ProjectNameStyle{0}", _displaySize.ToString()); }
}

申请风格:

<Application.Resources>
    <Style x:Key="ProjectNameStyleSmall" TargetType="TextBlock">
        <Setter Property="FontSize" Value="40" />
    </Style>
    <Style x:Key="ProjectNameStyleMedium" TargetType="TextBlock">
        <Setter Property="FontSize" Value="64" />
    </Style>
    <Style x:Key="ProjectNameStyleLarge" TargetType="TextBlock">
        <Setter Property="FontSize" Value="90" />
    </Style>

XAML 视图:

   <TextBlock 
        Text="{Binding Name}"
        Style="{Binding ., Mode=OneWay, Converter={cv:StyleConverter}, ConverterParameter=ProjectNameStyle}">

使用 StyleConverter 类实现 IValueConverter:

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
    if (targetType != typeof(Style))
    {
        throw new InvalidOperationException("The target must be a Style");
    }

    var styleProperty = parameter as string;
    if (value == null || styleProperty == null)
    {
        return null;
    }

    string styleValue = value.GetType()
        .GetProperty(styleProperty)
        .GetValue(value, null)
        .ToString();
    if (styleValue == null)
    {
        return null;
    }

    Style newStyle = (Style)Application.Current.TryFindResource(styleValue);
    return newStyle;
}

请注意,这是 WPF 代码,因为转换器是从 MarkupExtension 和 IValueConverter 派生的,但如果您使用静态资源并添加更多的工作,因为 TryFindResource 方法不存在,它将在 SL4 和 WP7 中工作。

希望对某人有所帮助,再次感谢史蒂文!

回答4

视图模型

private Style _dynamicStyle = (Style)Application.Current.FindResource("Style1");
        public Style DynamicStyle
        {
            get { return _dynamicStyle; }
            set
            {
                _dynamicStyle = value;
                OnPropertyChanged("DynamicStyle");
            }

        }

public event PropertyChangedEventHandler PropertyChanged;

    private void OnPropertyChanged(string propertyName)
    {
        if (PropertyChanged != null)
        {
            PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
        }
    }

在您的 ViewModel 中实现一个属性,然后在您想要的任何位置动态更改样式,如下所示。

DynamicStyle=(Style)Application.Current.FindResource("Style2");// you can place this code where the action get fired

看法

然后设置DataContext值,然后在您的视图中实现以下代码

    <Button Style="{Binding DynamicStyle,Mode=TwoWay}"/>

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在doubleclick上可编辑的WPF树视图项目? (有样式吗?)(Editable WPF treeview item on doubleclick? (with styles?))
    问题 我有点像WPF菜鸟,因此对于这个问题中的任何固有愚蠢行为深表歉意(!) 我正在尝试通过双击启用WPF树视图标签的编辑-我已对此进行了谷歌搜索,看起来这两种方法是使用自定义控件或隐藏TextBox / TextBlock之一的样式。 使用样式将标签设置为基于数据框的文本框似乎很容易(例如,下面的1),但这意味着选择行的任何时间,它是“被编辑”。 我真正想做的是在mousedoubleclick事件上启用此(转换到文本框),但是似乎EventTriggers不能以下面的方式使用,因为它们是瞬时的。 (似乎我不能简单地在代码隐藏中使用DoubleClick事件,因为那不能(??)允许我影响显示的控件来显示/隐藏文本框)。 使用完全自定义控件似乎是一种替代方法-这里有一个AAALMOST工作示例(http://www.codeproject.com/KB/WPF/editabletextblock.aspx),但是在存在HierachicalDataTemplate子句的情况下,它不起作用(而且看起来还没有解决方案)。 (例如1-选中时从文本块切换到文本框) <Window x:Class="treetest.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http
  • WPF:如何使 XAML 中的样式以您自己的 C# 代码中的变量为条件(WPF: How to make styles in XAML conditional on a variable in your own C# code)
    问题 WPF 和 XAML 新手在这里.... 我需要将 XAML 代码中的 WPF Trigger或DataTrigger Trigger DataTrigger到 XAML 控件类以外的类中的某些 C# 代码中。 这是非常令人沮丧的,因为我读过的所有 28,000 篇教程都只给出了一个关于Trigger或DataTrigger的简单示例,这些示例涉及已经存在的属性(例如MouseOver ),没有一个示例说明如何将其与您自己的 C# 代码联系起来。 我有一个用于显示各种报告类型的屏幕。 所有报告类型的 XAML 都是相同的,除了诊断报告,我的要求是 DataGrid 单元格配置为TextBlock.TextAlignment="Left" ,而所有其他报告(即默认值)应为TextBlock.TextAlignment="Center" 。 (还有一些其他差异;为简洁起见,我只想说这是唯一的差异。)我真的不想复制整个 XAML 来对诊断报告进行特殊情况处理,因为其中 99% 将是与其他报告相同。 要使用触发器,我想也许我需要我的类从 DependencyObject 继承,以便我可以在其中定义 DependencyProperty(作为 WPF 新手,我意识到我可能会说一些非常古怪的事情)。 所以在我的 C# 代码中,我有一个这样的类...... namespace
  • 有没有一种方法可以确定在哪里声明/创建了WPF绑定?(Is there a way to determine where a WPF Binding is declared/created?)
    问题 我有一个项目引发一些数据绑定错误。 一个例子是: System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'MenuItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment') 我的问题是是否有一种方法可以确定此绑定的实际声明位置(无论是在XAML中声明还是在代码中声明)。 到目前为止,我已经尝试过: 为System.Windows.Data命名空间添加了级别为o All的调试跟踪; 这并没有产生更多有用的信息尝试在项目中对Binding一词进行文本搜索,以期找到Path设置为HorizontalContentAlignment所有绑定表达式; 我只找到了一个并将其删除,但是我仍然收到消息
  • WPF 绑定到样式中的另一个属性的绑定(WPF binding to another property's binding in a style)
    问题 我不确定问这个问题的最佳方式(抱歉问题标题含糊不清),但基本上我想使用从数据上下文传入属性的值转换器在 TextBox 上设置 MaxLength 属性,以及传入属性上的属性作为转换器参数。 我想以一种风格来做这一切,而不是在逐个控制的基础上。 这是以非样式方式执行此操作的示例: <TextBox Text="{Binding MyPropertyName.TheirPropertyName}" MaxLength="{Binding MyPropertyName, Converter={StatocRespirceMyCoolConverter}, ConverterParameter=TheirPropertyName}" /> (如果您想知道,他们的PropertyName 表示 MyPropertyName 类型上的一个属性,该属性具有类似 [StringMaxLength(15)] 的属性,我可以在值转换器中访问并返回该属性。)此外,是否有什么方法可以传入 MyPropertyName 的类型而不是实例? 我只需要类型来执行 StringMaxLength 属性查找。 无论如何,我怎么能以一种风格去做这样的事情呢? 我已经到了: <Setter Property="MaxLength"> <Setter.Value> <Binding Converter="
  • WPF某些样式未应用于DataTemplate控件(WPF Some styles not applied on DataTemplate controls)
    问题 我正在尝试学习有关WPF的知识,其灵活性让我感到惊讶。 但是,我遇到了Style和DataTemplate的问题,这有点令人困惑。 我在下面的测试页中定义了一些样式等内容,发现在<Page.Resources>为Border和TextBlock定义的Style不在DataTemplate ,但是以完全相同的方式应用了ProgressBar Style 。 源代码(我只使用Kaxaml和XamlPadX来查看结果) <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Page.Resources> <Style TargetType="{x:Type Border}"> <Setter Property="Background" Value="SkyBlue"/> <Setter Property="BorderBrush" Value="Black"/> <Setter Property="BorderThickness" Value="2"/> <Setter Property="CornerRadius" Value="5"/> </Style> <Style
  • 以WPF样式进行绑定会导致莫名其妙的“找不到管理FrameworkElement”错误(Binding in WPF style causes inexplicable “Cannot find governing FrameworkElement” error)
    问题 我有一个显示一堆矩形的ItemsControl 。 每个矩形都需要向上和向左偏移。 因此,我创建了一个RectangleStyle ,它使用绑定为RectangleStyle设置宽度,高度,X平移和Y平移。 宽度和高度绑定工作正常,但是我在TranslateTransform绑定中遇到以下错误: System.Windows.Data错误:2:找不到目标元素的管理FrameworkElement或FrameworkContentElement。 BindingExpression:Path = Offset.X; DataItem = null; 目标元素是'TranslateTransform'(HashCode = 16452547); 目标属性为“ X”(类型为“ Double”) 这是我的ItemControl的定义: <ItemsControl Style="{StaticResource ItemsControlStyle}" ItemsSource="{Binding Zones}"> <ItemsControl.ItemTemplate> <DataTemplate> <Rectangle Style="{StaticResource RectangleStyle}" /> </DataTemplate> </ItemsControl.ItemTemplate
  • 绑定到DataContext的WPF样式DataTrigger不起作用(WPF Style DataTrigger with binding to DataContext not working)
    问题 我有一个文本框,其样式具有更改文本的DataTrigger,如下所示: <Grid> <TextBlock Text="Foo"> <TextBlock.Style> <Style BasedOn="{StaticResource TextStyle}" TargetType="TextBlock"> <Style.Triggers> <DataTrigger Binding="{Binding MyBool}" Value="True"> <Setter Property="Text" Value="Bar"/> </DataTrigger> </Style.Triggers> </Style> </TextBlock.Style> </TextBlock> </Grid> 但是它不起作用,文本永远不会更改为“ Bar”。 我已经测试过将另一个TextBlock与Text =“ {Binding MyBool}”一起使用,并且此文本从“ False”更改为“ True”。 Snoop没有发现我可以看到的错误,并且输出中没有任何内容。 这个问题似乎是WPF触发器绑定到MVVM属性的重复,但是我的代码似乎与那里接受的答案没有什么不同(http://www.thejoyofcode.com/Help_Why_cant_I_use_DataTriggers_with
  • 如何在WPF中动态创建数据网格?(How to dynamically create a datagrid in WPF?)
    问题 我在XAML中具有以下datagrid: <DataGrid ItemsSource="{Binding View}" AutoGenerateColumns="False" IsReadOnly="True" GridLinesVisibility="None" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False" > <DataGrid.ColumnHeaderStyle> <Style TargetType="{x:Type DataGridColumnHeader}"> <Setter Property="FontWeight" Value="Bold" /> <Setter Property="FontSize" Value="12" /> </Style> </DataGrid.ColumnHeaderStyle> <DataGrid.Columns> <DataGridTextColumn Header="Type" Width="200" FontSize="12" Binding="{Binding Path=Name}" />
  • WPF使用样式从嵌套元素内绑定到父属性(WPF Bind to parent property from within nested element using style)
    问题 我一直在尝试构建一个带有空的提示的文本框。 我在从样式中设置提示文本时遇到麻烦。 确切地说,这是可行的(也就是说,它可以正确绑定): <TextBox Tag="hint text"> <TextBox.Background> <VisualBrush Stretch="None"> <VisualBrush.Visual> <TextBlock Text="{Binding Tag, RelativeSource={RelativeSource AncestorType=TextBox}}" FontStyle="Italic" Foreground="LightGray" /> </VisualBrush.Visual> </VisualBrush> </TextBox.Background> </TextBox> 但是,当我将其移至“样式”时,它不会: <Style TargetType="TextBox" x:Key="stlHintbox"> <Style.Triggers> <DataTrigger Binding="{Binding Text, RelativeSource={RelativeSource Mode=Self}}" Value=""> <Setter Property="Background"> <Setter.Value>
  • 如何使用WPF Toolkit Datagrid更改单元格的背景颜色(How do I change the background color of a cell using WPF Toolkit Datagrid)
    问题 我正在使用WPF工具包datagrid,并且我想根据单元格的内容设置单元格的背景颜色,而不是行的颜色。 为了简单起见,假设该列称为Foo,我希望单元格的背景在Foo为1时为蓝色,在Foo为2时为红色,在Foo为3时为黄色,在Foo大于3时为绿色。 。 如果可以的话,我很确定我可以解决需要处理的任何更复杂的情况。 回答1 您可以通过Styles和DataTriggers来实现。 只需使用默认背景属性(在本例中为Green)设置ElementStyle,然后为其他情况添加DataTriggers: <DataGridTextColumn Binding="{Binding WhateverIWantToDisplay}" > <DataGridTextColumn.ElementStyle> <Style TargetType="{x:Type TextBlock}"> <Setter Property="Background" Value="Green" /> <Style.Triggers> <DataTrigger Binding="{Binding Foo}" Value="1"> <Setter Property="Background" Value="Blue" /> </DataTrigger> <DataTrigger Binding="{Binding Foo}
  • WPF 图像命令绑定(WPF Image Command Binding)
    问题 我正在将一个 WPF 应用程序放在一起,其中我有一个图像控件,我想将自定义命令对象绑定到我的视图模型中,该视图模型将在单击图像时执行。 我已经从我的视图模型中公开了命令对象,只需要将它绑定到图像控件。 是否可以将此命令对象绑定到图像控件? 如果是这样,任何建议将不胜感激。 回答1 您需要将图像放入按钮中,并将按钮绑定到命令: <Button Command="{Binding MyCommand}"> <Image Source="myImage.png" /> </Button> 如果您不想要标准按钮镶边,只需使用以下内容更改按钮模板: <ControlTemplate x:Key="tplFlatButton" TargetType="{x:Type Button}"> <Border Width="{TemplateBinding Width}" Height="{TemplateBinding Height}" Background="{TemplateBinding Background}" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}"> <ContentPresenter HorizontalAlignment="
  • 将WPF Datagrid单元格背景色与触发器绑定(Binding WPF Datagrid cell background colour with trigger)
    问题 我希望WPF数据网格单元格的背景色在修改内容后更改颜色。 每个单元格后面都有一个ViewModel对象,该对象包含以下属性-Value,OriginalValue和Modified。 当用户编辑单元格内容时,这将通过数据绑定自动触发Amount属性。 然后,此属性设置器将其与原始值进行比较,并将布尔值Modified属性分别设置为true或false,并通知这些属性的绑定进行更新。 到目前为止,我已经在DataGridTextColumn的ElementStyle属性上使用Style实现了部分结果,如下所示 <Style x:Key="DataGridTextStyle" TargetType="{x:Type TextBlock}"> <Style.Triggers> <DataTrigger Binding="{Binding Path=MyViewModel.Modified}" Value="True"> <Setter Property="Background" Value="Yellow"/> </DataTrigger> </Style.Triggers> </Style> 这将更新文本内容的背景色,但这只是单元格中心的一小部分。 我希望整个单元格更新其背景色,而不仅仅是textblock属性。
  • 属性和依赖属性之间有什么区别(What is the difference between Property and Dependency Property)
    问题 依赖项属性的创建方式与属性相同。 仅在创建自定义控件时才使用依赖项属性吗? 回答1 依赖项属性是注册另一个属性的属性(不是其自身,而是依赖于另一个属性,例如XAML Binding属性)。 Dependecy属性通过注册来在后面的代码中注册其他绑定属性。 我的项目中使用的示例如下: public static DependencyProperty ImageUri = DependencyProperty.Register("Source", typeof(BitmapImage), typeof(CustomImagePlaceHolder), new PropertyMetadata(null)); 在上面的代码中,ImageUri是一个注册Source的依赖项属性,该属性是在generic.xaml(无论是否声明,定义或其他任何东西)中定义/声明的,如下所示: ..HorizontalAlignment="Center" VerticalAlignment="Center" Height="{TemplateBinding Height}" Width="{TemplateBinding Width}" /> 因此,在这里非常重要的是XAML中的模板绑定值应在后面的代码中注册为依赖项属性。 因此,当我们在XAML中定义了Image
  • 可可与微软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文件
  • 我的WPF样式设置器可以使用TemplateBinding吗?(Can my WPF Style Setter use a TemplateBinding?)
    问题 我正在尝试做这样的事情... <Style x:Key="MyBorderStyle" TargetType="Border"> <Setter Property="BorderBrush" Value="{StaticResource MyBorderBrush}" /> <Setter Property="Background" Value="{StaticResource MyBackgroundBrush}" /> <Setter Property="Padding" Value="{TemplateBinding Padding}" /> </Style> ...但出现错误: 'Padding' member is not valid because it does not have a qualifying type name. 如何提供“限定类型名称”? 注意:我要这样做的原因是,我想在一系列相似的ControlTemplates中包含相同的Border。 谢谢。 编辑: 好吧,我尝试过了... <Setter Property="Padding" Value="{TemplateBinding GridViewColumnHeader.Padding}" /> ...它实际上已经编译了,但是当我运行该应用程序时,我得到了XamlParseException :
  • 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>
  • 使用 WPF 根据绑定属性动态显示控件(Dynamically display a control depending on bound property using WPF)
    问题 我有一个属性,它是一种数据库数据类型( char 、 DateTime 、 int 、 float等...),我想更改用于输入所选类型值的控件。 因此,对于文本值,我想要一个TextBox而对于日期值,我想要一个DatePicker 。 我想这样做的一种方法是在我的表单上使用每个控件之一,并使用适当的IValueConverter实现设置它们的Visibility 。 我知道这会起作用,但它会创建很多代码并且感觉不太好。 我认为的另一种方法是使用ContentPresenter并使用Style和DataTriggers设置其内容,但我无法让它工作。 <Style x:Key="TypedValueHelper" TargetType="{x:Type ContentPresenter}"> <Style.Triggers> <DataTrigger Binding="{Binding Path=DataType}" Value="Char"> <Setter Property="Content" Value="???"/> </DataTrigger> <DataTrigger Binding="{Binding Path=DataType}" Value="Date"> <Setter Property="Content" Value="???"/> <
  • WPF 错误样式仅在选项卡控件的可见选项卡上正确呈现(WPF Error Styles only being rendered properly on visible tab of a tab control)
    问题 我有一个用于包含支持INotifyPropertyChanged和IDataErrorInfo UI 数据的数据对象。 最初,我在一个大型 WPF 应用程序中显示了所有 UI 控件,并且很高兴看到通过此自定义样式标记的错误: <!-- Set error style for textboxes --> <Style x:Key="txtBoxErrStyle" TargetType="{x:Type TextBox}"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="True"> <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)[0].ErrorContent}" /> </Trigger> </Style.Triggers> <Setter Property="Validation.ErrorTemplate"> <Setter.Value> <ControlTemplate> <DockPanel DockPanel.Dock="Right"> <AdornedElementPlaceholder />
  • WPF:MenuItem.CommandParameter 绑定设置为 null(WPF : MenuItem.CommandParameter binding set to null)
    问题 我为我的数据网格定义了以下 ContextMenu: <igDP:XamDataGrid.ContextMenu> <ContextMenu ItemsSource="{Binding CommandViewModels}" > <ContextMenu.ItemContainerStyle> <Style TargetType="MenuItem"> <Setter Property="Command" Value="{Binding Command}" /> <Setter Property="CommandParameter" Value="{Binding CommandParameter}" /> <Setter Property="Header" Value="{Binding Name}" /> <Setter Property="Icon" Value="{Binding Icon}" /> </Style> </ContextMenu.ItemContainerStyle> </ContextMenu> </igDP:XamDataGrid.ContextMenu> CommandViewModel 类定义如下: public class CommandViewModel : ICommandViewModel { public
  • 如何在WPF中应用多种样式(How to apply multiple styles in WPF)
    问题 在WPF中,如何将多种样式应用于FrameworkElement ? 例如,我有一个已经具有样式的控件。 我还有另外一种风格,我想在不破坏第一个风格的情况下增加它。 样式具有不同的TargetType,因此我不能仅将其中一种进行扩展。 回答1 我认为简单的答案是(至少在此版本的WPF中)您无法执行尝试执行的操作。 也就是说,对于任何特定元素,只能应用一种样式。 但是,正如上面其他人所述,也许您可​​以使用BasedOn来帮助您。 检查以下一块松散的xaml。 在其中,您将看到我有一个基础样式,该基础样式正在设置一个属性,该属性存在于要应用两种样式的元素的基础类上。 并且,在基于基本样式的第二种样式中,我设置了另一个属性。 因此,这里的想法是...如果您可以某种方式将要设置的属性分开...根据要在其上设置多种样式的元素的继承层次结构,则可能会有解决方法。 <Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> <Page.Resources> <Style x:Key="baseStyle" TargetType="FrameworkElement"> <Setter