C# 共享转换器结果

C# 共享转换器结果,c#,wpf,xaml,C#,Wpf,Xaml,是否有方法共享转换器的结果,以防止每个绑定执行每个转换器 大概是这样的: <UserControl> <UserControl.Resource> <Visibility x:Key="VisibilityResource" > <Binding Path="myEnum" Converter="EnumToVisibilityConverter"/>

是否有方法共享转换器的结果,以防止每个绑定执行每个转换器

大概是这样的:

<UserControl>
  <UserControl.Resource>
    <Visibility x:Key="VisibilityResource" >
        <Binding Path="myEnum" Converter="EnumToVisibilityConverter"/>
    </Visibility>
  </UserControl.Resource>

    <StackPanel   VerticalAlignment="Center">
        <Button Content="Button1" Height="80" Click="ButtonBase_OnClick"  />
        <Button Content="Button2" Height="80" Visibility="{StaticResource VisibilityResource} />
        <Button Content="Button3" Height="80" Visibility="{StaticResource VisibilityResource} />
        <Button x:Name="Button4" Content="Button4" Height="80" Visibility="{StaticResource VisibilityResource} />
    </StackPanel>
</UserControl>

您可以使用该类(Internet上有许多类似的实现):

在参考资料中,声明此类的一个实例,并需要数据属性中的绑定:

<Window.Resources>
    <local:BindingProxy  x:Key="VisibilityResource" 
                         Data="{Binding Path, Converter={StaticResource EnumToVisibilityConverter}}"/>
</Window.Resources>
<StackPanel   VerticalAlignment="Center">
    <Button Content="Button1" Height="80" Click="ButtonBase_OnClick"  />
    <Button Content="Button2" Height="80" Visibility="{Binding Data, Source={StaticResource VisibilityResource}}" />
    <Button Content="Button3" Height="80" Visibility="{Binding Data, Source={StaticResource VisibilityResource}}" />
    <Button x:Name="Button4" Content="Button4" Height="80" Visibility="{Binding Data, Source={StaticResource VisibilityResource}}" />
</StackPanel>

此外,在XAML中,可以将绑定设置为其数据属性:

<Window.Resources>
    <local:BindingProxy  x:Key="VisibilityResource" 
                         Data="{Binding Path, Converter={StaticResource EnumToVisibilityConverter}}"/>
</Window.Resources>
<StackPanel   VerticalAlignment="Center">
    <Button Content="Button1" Height="80" Click="ButtonBase_OnClick"  />
    <Button Content="Button2" Height="80" Visibility="{Binding Data, Source={StaticResource VisibilityResource}}" />
    <Button Content="Button3" Height="80" Visibility="{Binding Data, Source={StaticResource VisibilityResource}}" />
    <Button x:Name="Button4" Content="Button4" Height="80" Visibility="{Binding Data, Source={StaticResource VisibilityResource}}" />
</StackPanel>

另一种方法不是通过资源,而是使用任何元素的Tag属性和ElementName类型的绑定:

<StackPanel x:Name="stPnl"   VerticalAlignment="Center" Tag="{Binding Path, Converter={StaticResource EnumToVisibilityConverter}}">
    <Button Content="Button1" Height="80" Click="ButtonBase_OnClick"  />
    <Button Content="Button2" Height="80" Visibility="{Binding Tag, ElementName=stPnl}" />
    <Button Content="Button3" Height="80" Visibility="{Binding Tag, ElementName=stPnl}" />
    <Button x:Name="Button4" Content="Button4" Height="80" Visibility="{Binding Tag, ElementName=stPnl}" />
</StackPanel>

还有更多的解决方案。
如果您对上述内容不满意,请详细填写您需要的内容。

在问题末尾,我想与其他人分享我的研究成果: 最好的解决方案是从以下位置使用BindingResourceExtension和BindingProxy:

在XAML中,我们有:

<UserControl.Resources>
        <windows:BindingProxy  x:Key="VisibilityResource" 
                             Data="{Binding myEnum, Converter={StaticResource EnumToVisibilityConverter}}"/>
        <Binding Path="Data" Source="{StaticResource VisibilityResource}" x:Key="MyBinding" />
</UserControl.Resources>

<StackPanel   VerticalAlignment="Center">
      <Button Content="Button1" Height="80" Click="ButtonBase_OnClick"  />
      <Button Content="Button2" Height="80" Visibility="{windows:BindingResource MyBinding}"/>
      <Button Content="Button3" Height="80" Visibility="{windows:BindingResource MyBinding}"/>
      <Button Content="Button4" Height="80" Visibility="{windows:BindingResource MyBinding}"/>
</StackPanel>


这种方法的优点是易于调试,并且转换器只运行一次。如您所见,重复的代码也减少了。

您可以向转换器添加一个静态字典,并根据类型和值设置键。但我真的不明白你为什么需要这样的东西。转换器应该是轻量级的。在这样做之前,你应该先考虑一下你的结构。这种方法可以帮助我更容易地调试程序,还可以防止额外的执行,例如,字符串到图像转换器在太多元素中使用时不轻。您能详细解释一下您的建议吗?您的
字符串
图像
转换器的示例就是一个很好的坏方法示例。你应该在某个地方为你的图像缓存。转换器只给缓存密钥,缓存返回图像。正如您所看到的,转换器是轻量级的,因为加载和缓存是在图像缓存上完成的。非常感谢,这就是我问题的答案
<UserControl.Resources>
        <windows:BindingProxy  x:Key="VisibilityResource" 
                             Data="{Binding myEnum, Converter={StaticResource EnumToVisibilityConverter}}"/>
        <Binding Path="Data" Source="{StaticResource VisibilityResource}" x:Key="MyBinding" />
</UserControl.Resources>

<StackPanel   VerticalAlignment="Center">
      <Button Content="Button1" Height="80" Click="ButtonBase_OnClick"  />
      <Button Content="Button2" Height="80" Visibility="{windows:BindingResource MyBinding}"/>
      <Button Content="Button3" Height="80" Visibility="{windows:BindingResource MyBinding}"/>
      <Button Content="Button4" Height="80" Visibility="{windows:BindingResource MyBinding}"/>
</StackPanel>