Я хотел бы уточнить немного больше.
Для меня MultiBinding
и MultiDataTrigger
принципиально разные, и хотя в некоторых ситуациях вы можете использовать оба для достижения одной и той же функциональности, это похоже на хак, чтобы заставить оба работать одинаково.
MultiDataTrigger
s следует использовать, когда вам нужно выполнить более одного условия отдельно, чтобы вы могли выполнить действие (установить значение свойства, начать анимацию и т. д.). Например, вам нужно, чтобы A
было истинным, а B
— ложным. Оба эти условия сами по себе могут интерпретироваться по отдельности. Это случай этого вопроса.
MultiBinding
s, с другой стороны, следует использовать, когда вам нужно более одного параметра для расчета одного выхода по вашему выбору. Этот вывод должен иметь некоторое значение для установки свойства. Например, вы измените значение свойства, только если A
равно B
. Это имеет смысл, когда вы используете один и тот же стиль для нескольких элементов управления, и A является свойством элемента управления (скажем, свойство Text TextBlock), а B является одним свойством из модели представления с именем SelectedText. Таким образом, проблема, которую мы можем попытаться решить, заключается в следующем: среди всех TextBlocks в моем представлении установите передний план одного с тем же текстом, что и свойство SelectedText из моей модели представления, чтобы мигать (анимация изменения цвета).
В вашем примере я бы использовал MultiDataTrigger
, так как ваши условия можно оценить отдельно. В противном случае ваш MultiValueConverter будет проверять только ваше второе условие, игнорируя первое и не будет служить реальной цели для того, чтобы быть MultiDataTrigger на самом деле.
Я оставлю XAML для примера, где я буду использовать DataTrigger
с MultiBinding
, о которых я упоминал выше: (я предполагаю, что вы используете шаблон MVVM)
<Style TargetType="{x:Type TextBlock}" x:Key="SelectedTextStyle">
<Setter Property="FontFamily" Value="Segoe UI Light"/>
<Setter Property="FontSize" Value="24"/>
<Setter Property="HorizontalAlignment" Value="Left"/>
<Style.Triggers>
<DataTrigger Value="True">
<DataTrigger.Binding>
<MultiBinding Converter="{StaticResource StringsToBooleanConverter}">
<Binding Path="SelectedText"/> <!--This is a property of the View Model-->
<Binding RelativeSource="{RelativeSource Self}" Path="Text"/> <!--This is the Dependency Property 'Text' of the TextBlock control-->
</MultiBinding>
</DataTrigger.Binding>
<DataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Foreground.Color" Duration="0:0:2" From="Black" To="DarkOrange" AutoReverse="True" FillBehavior="HoldEnd" RepeatBehavior="Forever"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.EnterActions>
<DataTrigger.ExitActions>
<BeginStoryboard>
<Storyboard>
<ColorAnimation Storyboard.TargetProperty="Foreground.Color" Duration="0:0:0" From="DarkOrange" To="Black" FillBehavior="HoldEnd"/>
</Storyboard>
</BeginStoryboard>
</DataTrigger.ExitActions>
</DataTrigger>
</Style.Triggers>
</Style>
person
Daniel Marques
schedule
13.03.2019
MultiDataTrigger
, посколькуSomeConverter
, скорее всего, будет использоваться где-то еще, аfooConv
, скорее всего, не будет использоваться в других местах. - person Novitchi S   schedule 08.01.2014&&
для своих значений, и я использую его довольно часто, хотя я смутно задаюсь вопросом, не упускаю ли я какой-то более простой подход. - person mcwyrm   schedule 08.01.2014