我有一个带有图像的Row的数据网格.此图像与某个状态的触发器绑定.当状态改变时我想改变图像.
模板本身在DataGridTemplateColumn的HeaderStyle上设置.此模板具有一些绑定.第一个绑定日显示它是什么日期,状态通过触发器更改图像.
这些属性在ViewModel中设置.
属性:
public class HeaderItem
{
public string Day { get; set; }
public ValidationStatus State { get; set; }
}
this.HeaderItems = new ObservableCollection<HeaderItem>();
for (int i = 1; i < 15; i++)
{
this.HeaderItems.Add(new HeaderItem()
{
Day = i.ToString(),
State = ValidationStatus.Nieuw,
});
}
Run Code Online (Sandbox Code Playgroud)
数据网格:
<DataGrid x:Name="PersoneelsPrestatiesDataGrid" HorizontalAlignment="Stretch" VerticalAlignment="Stretch"
AutoGenerateColumns="False" SelectionMode="Single" ItemsSource="{Binding CaregiverPerformances}" FrozenColumnCount="1" >
<DataGridTemplateColumn HeaderStyle="{StaticResource headerCenterAlignment}" Header="{Binding HeaderItems[1]}" Width="50">
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<TextBox Text="{ Binding Performances[1].Duration,Converter={StaticResource timeSpanConverter},Mode=TwoWay}"/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock TextAlignment="Center" Text="{ Binding …Run Code Online (Sandbox Code Playgroud) 作为一个背景--Windows有一个Touch/TabletPCs工具,它可以根据你的"用手"移动弹出菜单/菜单的位置(以防止菜单出现在你的手下).
基本上这是做什么的,如果你被设置为"右手"(它似乎默认为你连接了一个触摸设备),你打开的每个弹出窗口被人为地踢到左边 - 这会导致我们尝试的大量布局问题并将弹出窗口与"弹出"项目对齐:
平板电脑设置设置为左手 - 不从Windows进行人工修正

平板电脑设置设置为右手 - Windows人工调整我们的定位

我们可以使用SystemParameters.MenuDropAlignment来检测此设置的设置,对于普通的弹出窗口,我们可以使用弹出窗口的实际宽度来调整它 - 但是对于动态弹出窗口以及当我们将右向左支撑放入混合时,这只是没有'工作.
目前看起来我们更有可能必须经历每个弹出窗口,手动设计一个值来调整踢,并为每个弹出一个类似的东西:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Source={x:Static SystemParameters.MenuDropAlignment}}" Value="True"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=FlowDirection}" Value="RightToLeft"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="HorizontalOffset" Value="-50"/> <!-- Set to arbitrary value to test -->
</MultiDataTrigger.Setters>
</MultiDataTrigger>
Run Code Online (Sandbox Code Playgroud)
那么..回到问题:-)有没有人知道如何停止WPF弹出窗口看这个设置呢?
对于那些没有触摸设备的用户,您可以通过运行以下方式访问Tablet PC设置:
C:\ Windows\explorer.exe shell ::: {80F3F1D5-FECA-45F3-BC32-752C152E456E}
并看到它为自己造成的混乱:-)
我的WPF应用程序中有一个DataGrid控件.我有一个适合DataGridRow该类的默认自定义样式.但是,对于这个DataGrid特定屏幕上的这个特定,我需要一个不同的自定义样式.
每行中的Items都有一个bool属性,设置后,我想显示具有不同前景色和背景色的行.但是,当选择行并且设置了该属性时,我想要一个不同的前景色和背景色来显示它已被选中并且该属性设置为true.
这是我尝试过的:
<Style TargetType="DataGridRow" x:Key="CameraStyle">
<Setter Property="Foreground" Value="{DynamicResource TextForeground}" />
<Setter Property="Background" Value="{DynamicResource DataBackground}" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Property="IsSelected" Value="False" />
<Condition Binding="{Binding Path=IsInLiveMode}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Foreground" Value="Red" />
<Setter Property="Background" Value="Yellow" />
</MultiDataTrigger>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Property="IsSelected" Value="True" />
<Condition Binding="{Binding Path=IsInLiveMode}" Value="True" />
</MultiDataTrigger.Conditions>
<Setter Property="Background" Value="DarkOrange" />
<Setter Property="BorderBrush" Value="{DynamicResource DataBorder}" />
<Setter Property="Foreground" Value="DarkRed" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
Run Code Online (Sandbox Code Playgroud)
这给了我一个"绑定必须是非null"错误,我认为这是因为BindingMultiDataTrigger中的第一个条件没有属性.
在XAML中写这个的正确方法是什么?
编辑:
在尝试了nemesv和Rachel的答案后,代码现在编译并运行.但是,我为IsSelected …
Style当属性和数据值为true时,我需要能够更改控件.例如,我的绑定数据有一个IsDirty属性.如果IsDirty为true,我想更改控件的背景颜色并选择控件.我找到了MultiTrigger和MultiDataTrigger类......但在这种情况下,我需要以某种方式触发数据和属性.我怎样才能做到这一点?
另一个注意事项:我需要能够在XAML背后的代码中执行此操作.
我使用的是XAML代码的一部分
<DataTrigger Binding="{Binding Path=Name}" Value="1">
<Setter Property="Header" TargetName="expanderHeader" Value="Course Text"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Name}" Value="2">
<Setter Property="Header" TargetName="expanderHeader" Value="Media Lecture"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Name}" Value="3">
<Setter Property="Header" TargetName="expanderHeader" Value="Assessment"/>
<DataTrigger Binding="{Binding Path=Name}" Value="4">
<Setter Property="Header" TargetName="expanderHeader" Value="Question"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path=Name}" Value="5">
<Setter Property="Header" TargetName="expanderHeader" Value="General"/>
</DataTrigger>
Run Code Online (Sandbox Code Playgroud)
现在我想使用dataTrigger,其值可以是3,301,302或303.我该怎么做.我尝试使用Multidatatrigger,但它没有用.我尝试使用Multidatatrigger的代码是:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding Path=Name}" Value="301"/>
<Condition Binding="{Binding Path=Name}" Value="301"/>
<Condition Binding="{Binding Path=Name}" Value="302"/>
<Condition Binding="{Binding Path=Name}" Value="303"/>
</MultiDataTrigger.Conditions>
<Setter Property="Header" TargetName="expanderHeader" Value="Assessment"/>
</MultiDataTrigger>
Run Code Online (Sandbox Code Playgroud) 在我的 WPF 控件中,我有以下两个触发器:
<Trigger
Property="Controls:TreeViewExItem.IsMouseOver"
Value="True"
SourceName="ElementGrid">
Run Code Online (Sandbox Code Playgroud)
和
<DataTrigger
Binding="{Binding
RelativeSource={RelativeSource AncestorType={x:Type Controls:TreeViewEx}},
Path=HoverHighlighting}"
Value="False">
Run Code Online (Sandbox Code Playgroud)
两者本身都工作得很好。但我需要这些的结合。我试过这个:
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition
Binding="{Binding
RelativeSource={RelativeSource AncestorType={x:Type Controls:TreeViewEx}},
Path=HoverHighlighting}"
Value="True"/>
<Condition
Binding="{Binding
(Controls:TreeViewExItem.IsMouseOver),
Source=ElementGrid}"
Value="True"/>
</MultiDataTrigger.Conditions>
Run Code Online (Sandbox Code Playgroud)
但它什么也没做。我在输出窗口中收到此消息:
System.Windows.Data 错误:17:无法从“”(类型“字符串”)获取“IsMouseOver”值(类型“布尔”)。绑定表达式:路径=(0); DataItem='字符串' (HashCode=1047858601); 目标元素是 'TreeViewExItem' (Name=''); 目标属性为“NoTarget”(类型“Object”) InvalidCastException:“System.InvalidCastException:Das Objekt des Typs“System.String”可以在 Typ“System.Windows.DependencyObject”umgewandelt werden 中使用。
这并没有告诉我任何事情。它将如何运作?
更新:完整的项目代码现在可以在我的 GitHub 存储库中查看。我对 MultiDataTrigger 的猜测当前位于。
我目前正在分析一些使用大量使用MultiDataTriggers的样式的XAML (每种样式8-10个多数据触发器,每个触发器有4-6个条件).在考虑这个时,我正在考虑使用转换器(或多值转换器)是否更有效,特别是因为无法调试MultiDataTriggers.
任何人都可以权威地说明如何编译MultiDataTriggers吗?我明白条件是和的,它是以这样的方式编译的,即短切割的特色?
多个MultiDataTriggers怎么样?它们是否被短路以使第一个完全满意导致评估停止?或者,如果有几个人满意,他们是否都会在最后一个获胜时进行评估
我只想在我的两个数据网格都选择了项目时才启用按钮。现在,当两个数据网格都具有选择项时,将启用该功能。有任何想法吗?
<Button x:Name="button" Content="Z" Grid.Column="1" Margin="0,240,0,0" VerticalAlignment="Top" FontFamily="Wingdings 3" FontSize="21.333" ToolTip="Set the selected alarm for the selected alarm time">
<Button.Style>
<Style TargetType="Button">
<Setter Property="IsEnabled" Value="True" />
<Setter Property="Opacity" Value="1" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=alarmProfilesDataGrid, Path=SelectedItem}" Value="{x:Null}"/>
<Condition Binding="{Binding ElementName=alarmFilesDataGrid, Path=SelectedItem}" Value="{x:Null}"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.Setters>
<Setter Property="IsEnabled" Value="False" />
<Setter Property="Opacity" Value=".5" />
</MultiDataTrigger.Setters>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
Run Code Online (Sandbox Code Playgroud) 我有这个DataGrid:
<DataGrid ItemsSource="{Binding CustomerXml}"
Name="customersDataGrid" AutoGenerateColumns="False" DataContext="{Binding}">
<DataGrid.Columns>
<DataGridTextColumn Header="Name">
<DataGridTextColumn.Binding>
<Binding Path="Name" ValidatesOnDataErrors="True"
UpdateSourceTrigger="PropertyChanged" NotifyOnValidationError="True">
<Binding.ValidationRules>
<local:NameValidationRule/>
</Binding.ValidationRules>
</Binding>
</DataGridTextColumn.Binding>
</DataGridTextColumn>
...
</DataGrid.Columns>
</DataGrid>
Run Code Online (Sandbox Code Playgroud)
我正在尝试按ValidationRule结果禁用和启用保存按钮。
<Button Content="Save" Name="save" Click="save_Click">
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="false" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition
Binding="{Binding ElementName=customersDataGrid,
Path=(Validation.HasError)}" Value="false" />
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="true" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
Run Code Online (Sandbox Code Playgroud)
但如果ValidationResult设置为 true 或 false,按钮仍处于禁用状态。
谁能告诉我如何绑定到Usercontrol的元素?
我试图使用与IDataErrorInfo一起使用的数据触发器来禁用/启用按钮。
所以当元素在同一视图上时,我通常这样做
<Button Name="AddEditButton" Content="{Binding ButtonContent}" Command="{Binding AddCustomerCommand}" HorizontalAlignment="Center" Margin="0 10" >
<Button.Style>
<Style TargetType="{x:Type Button}">
<Setter Property="IsEnabled" Value="false" />
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding ElementName=CustomerFirstNameTextBox, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=CustomerLastNameTextBox, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=CustomerEmailTextBox, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=CustomerPhoneTextBox, Path=(Validation.HasError)}" Value="false" />
<Condition Binding="{Binding ElementName=CustomerCellphoneTextBox, Path=(Validation.HasError)}" Value="false" />
</MultiDataTrigger.Conditions>
<Setter Property="IsEnabled" Value="true" />
</MultiDataTrigger>
</Style.Triggers>
</Style>
</Button.Style>
</Button>
Run Code Online (Sandbox Code Playgroud)
但是现在我需要添加一个条件,该条件绑定到我的视图正在使用的Usercontrol(AdressControl)上的控件。
我希望可以像这样轻松访问usercontrol的元素
<Condition Binding="{Binding ElementName=AddressControl , Path=StreetTextBox.(Validation.HasError)}" Value="false" />
Run Code Online (Sandbox Code Playgroud)
但无济于事。任何帮助将非常感激
multidatatrigger ×10
wpf ×10
xaml ×5
c# ×4
triggers ×4
binding ×3
datagrid ×3
button ×1
datatrigger ×1
image ×1
multi-touch ×1
styles ×1
touch ×1
validation ×1