问题描述
假设我有以下简单的类: public class Person
{
public int Id {get;组; }
public string Name {get;组; }
}
public class PersonHolder
{
public Person CurrentPerson {get;组; }
public int ActiveId {get;组; }
}
现在我有一个网格,一个PersonHolder类的实例为 DataContext
,而在网格中,我有一个 StackPanel
绑定到 CurrentPerson
of PersonHolder
- 显示其数据:
< Grid>
< StackPanel x:Name =PersonPanelDataContext ={Binding CurrentPerson}>
< TextBlock Text ={Binding Id}/>
< TextBlock Text ={Binding Name}/>
< / StackPanel>
< / Grid>
所以 - 问题:如何给 StackPanel
绿色背景当 CurrentPerson
有一个 Id
匹配 ActiveId
PersonHolder (是非常有用的,但这只是一个非常简单的例子.. )。我的想法是,这是一个使用触发器的东西,但是可以在触发条件值中使用绑定吗?如果是这样,我可以这样做:
< Grid x:Name =Foo>
< StackPanel x:Name =PersonPanelDataContext ={Binding CurrentPerson}>
< TextBlock Text ={Binding Id}/>
< TextBlock Text ={Binding Name}/>
< StackPanel.Triggers>
< DataTrigger Binding ={Binding Id}Value ={Binding ElementName = Foo,Path = ActiveId}>
< Setter TargetName =PersonPanelProperty =BackgroundValue =Green/>
< / DataTrigger>
< /StackPanel.Triggers>
< / StackPanel>
< / Grid>
但这不行。我如何解决这个问题?
您不能对Value属性使用绑定,但可以通过使用和一个。我将在 Style
中定义我的触发器
。 Window.Resources将会提供如下的东西:
< Window.Resources>
< local:SomeMultiConverter x:Key =someMultiConverter/>
< Style x:Key =someStyleTargetType =StackPanel>
< Setter Property =StackPanel.BackgroundValue =Red/>
< Style.Triggers>
< DataTrigger Value =True>
< DataTrigger.Binding>
< MultiBinding Converter ={StaticResource someMultiConverter}>
< Binding Path =Id>< / Binding>
< Binding ElementName =FooPath =DataContext.ActiveId>< / Binding>
< / MultiBinding>
< /DataTrigger.Binding>
< Setter Property =StackPanel.BackgroundValue =Green/>
< / DataTrigger>
< /Style.Triggers>
< / Style>
< /Window.Resources>
< Grid x:Name =Foo>
< StackPanel DataContext ={Binding CurrentPerson}Style ={StaticResource someStyle}>
< TextBlock Text ={Binding Id}/>
< TextBlock Text ={Binding Name}/>
< / StackPanel>
< / Grid>
请参阅为 MultiBinding
和 IMultiValueConverter
。他们很容易写。
Let's say I have the following simple classes:
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
}
public class PersonHolder
{
public Person CurrentPerson { get; set; }
public int ActiveId { get; set; }
}
Now I have a grid with an instance of class PersonHolder as DataContext
, and in the grid I have a StackPanel
which is bound to the CurrentPerson
of PersonHolder
- showing its data:
<Grid>
<StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}">
<TextBlock Text="{Binding Id}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</Grid>
So - to the question: How can I give the StackPanel
a green background when the CurrentPerson
has an Id
matching the ActiveId
of the PersonHolder
(yeah, very useful, but this is just an extremely simplified example..). My thought is that this is something one uses a trigger for, but can I use bindings in my trigger condition value? If so I could do something like this:
<Grid x:Name="Foo">
<StackPanel x:Name="PersonPanel" DataContext="{Binding CurrentPerson}">
<TextBlock Text="{Binding Id}" />
<TextBlock Text="{Binding Name}" />
<StackPanel.Triggers>
<DataTrigger Binding="{Binding Id}" Value="{Binding ElementName=Foo, Path=ActiveId}">
<Setter TargetName="PersonPanel" Property="Background" Value="Green" />
</DataTrigger>
</StackPanel.Triggers>
</StackPanel>
</Grid>
But this doesn't work. How can I solve this?
You can't use a binding on the Value property, but you can get around this by using a MultiBinding and an IMultiValueConverter. I would define my Trigger
in a Style
in e.g. the Window.Resources, which would give something like this:
<Window.Resources>
<local:SomeMultiConverter x:Key="someMultiConverter" />
<Style x:Key="someStyle" TargetType="StackPanel">
<Setter Property="StackPanel.Background" Value="Red" />
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource someMultiConverter}">
<Binding Path="Id"></Binding>
<Binding ElementName="Foo" Path="DataContext.ActiveId"></Binding>
</MultiBinding>
</DataTrigger.Binding>
<Setter Property="StackPanel.Background" Value="Green" />
</DataTrigger>
</Style.Triggers>
</Style>
</Window.Resources>
<Grid x:Name="Foo">
<StackPanel DataContext="{Binding CurrentPerson}" Style="{StaticResource someStyle}" >
<TextBlock Text="{Binding Id}" />
<TextBlock Text="{Binding Name}" />
</StackPanel>
</Grid>
See this link for an example on MultiBinding
and IMultiValueConverter
. They're fairly easy to write.
这篇关于在DataTrigger条件下使用绑定的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!