Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从DataTrigger调用WPF方法_C#_Wpf_Xaml_Datatrigger - Fatal编程技术网

C# 从DataTrigger调用WPF方法

C# 从DataTrigger调用WPF方法,c#,wpf,xaml,datatrigger,C#,Wpf,Xaml,Datatrigger,是否可以使用通配符或调用方法来确定是否应应用DataTrigger 我当前将数据列表绑定到包含文件名的IEnumerable,如果文件扩展名以“old”开头,我希望文件名变灰 我的非工作梦想xaml标记如下所示: <DataTemplate.Triggers> <DataTrigger Binding="{Binding}" Value="*.old*"> <Setter TargetName="FileName" Property="For

是否可以使用通配符或调用方法来确定是否应应用DataTrigger

我当前将数据列表绑定到包含文件名的IEnumerable,如果文件扩展名以“old”开头,我希望文件名变灰

我的非工作梦想xaml标记如下所示:

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding}" Value="*.old*">
        <Setter TargetName="FileName" Property="Foreground" Value="Gray"/>
    </DataTrigger>
</DataTemplate.Triggers>


我能想到的唯一可行的解决方案是插入一个包含此逻辑的新视图模型属性,但如果可能的话,我希望避免更改视图模型。

这两个问题的答案都是肯定的……以迂回的方式

如果您使用绑定转换器,您可以向它传递一个参数,并让它返回一个布尔值,这将是执行您描述的操作的有效方法

<DataTemplate.Triggers>
    <DataTrigger Binding="{Binding Path=., Converter={StaticResource myFileExtensionConverter}, ConverterParameter=old}" Value="True">
        <Setter TargetName="FileName" Property="Foreground" Value="Gray"/>
    </DataTrigger>
</DataTemplate.Triggers>

基本上,当文件扩展名匹配时,您会得到一个“true”,它将触发触发器。

谢谢,这正是我要寻找的。每当我发现自己想要从xaml“调用方法”时,这很有趣,问题可以通过转换器解决。如果您需要多个参数(或可绑定参数),则可以使用IMultiValueConverter进行多绑定。
  public class MyFileExtensionConverter : IValueConverter {  
      public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
         Boolean returnValue = false;  

         String fileExtension = parameter as String;
         String fileName = value as String;

         if (String.IsNullOrEmpty(fileName)) { }
         else if (String.IsNullOrEmpty(fileExtension)) { }
         else if (String.Compare(Path.GetExtension(fileName), fileExtension, StringComparison.OrdinalIgnoreCase) == 0) {
            returnValue = true;
         }
         return returnValue;
      }

      public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
         return value;
      }
   }