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>