C# 通用替换多绑定节点中的转换器
我有一些要根据C# 通用替换多绑定节点中的转换器,c#,wpf,xaml,data-binding,multibinding,C#,Wpf,Xaml,Data Binding,Multibinding,我有一些要根据ViewModel中的多个属性更改的属性。每个单选按钮的可见性将根据相同的属性列表而有所不同。我有以下xaml: <RadioButton Command="{Binding Path=SomeCommand}" CommandParameter="SomeCommandParameter" Content="RB 1"> <RadioButton.Visibility> <Mult
ViewModel
中的多个属性更改的属性。每个单选按钮的
可见性将根据相同的属性列表而有所不同。我有以下xaml:
<RadioButton Command="{Binding Path=SomeCommand}"
CommandParameter="SomeCommandParameter"
Content="RB 1">
<RadioButton.Visibility>
<MultiBinding Converter="{StaticResource Rb1Visibility}">
<Binding Path="Value1"
RelativeSource="{RelativeSource Self}" />
<Binding Path="Value2"
RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</RadioButton.Visibility>
</RadioButton>
我可以为ViewModel中的每个RadioButton
创建一个“可见性”属性,但这会向ViewModel添加大量代码,并添加PropertyChanged
事件处理。
有没有一种简单的方法可以使多重绑定泛化,这样我就不会在整个xaml文件中重复代码?我是否应该采取不同的方法
更新-添加更复杂的示例
<RadioButton Command="{Binding Path=SomeCommand}"
CommandParameter="SomeCommandParameter"
Content="RB 1">
<RadioButton.Visibility>
<MultiBinding Converter="{StaticResource Rb1Visibility}">
<Binding Path="Value1"
RelativeSource="{RelativeSource Self}" />
<Binding Path="Value2"
RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</RadioButton.Visibility>
</RadioButton>
<RadioButton Command="{Binding Path=SomeCommand2}"
CommandParameter="SomeCommandParameter2"
Content="RB 2">
<RadioButton.Visibility>
<MultiBinding Converter="{StaticResource Rb2Visibility}">
<Binding Path="Value1"
RelativeSource="{RelativeSource Self}" />
<Binding Path="Value2"
RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</RadioButton.Visibility>
</RadioButton>
<RadioButton Command="{Binding Path=SomeCommand3}"
CommandParameter="SomeCommandParameter3"
Content="RB 3">
<RadioButton.Visibility>
<MultiBinding Converter="{StaticResource Rb3Visibility}">
<Binding Path="Value1"
RelativeSource="{RelativeSource Self}" />
<Binding Path="Value2"
RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</RadioButton.Visibility>
</RadioButton>
如何减少这里的多绑定
冗余
要更改每个单选按钮选项的转换器
创建一个新的多值转换器,它接受一个额外的参数(单选按钮选项),然后简单地根据该选项将调用路由到相应的转换器
可以将该选项放在控件Xaml的标记属性中
例子
我不清楚您提到的选项是什么,因此在我的示例中,让我们通过其标记
属性唯一地标识每个单选按钮,并使用路由转换器根据提供的标记
查找适当的转换器
<RadioButton Tag="1"/><RadioButton Tag="2"/>
然后更改样式以使用带有新参数的新转换器:
<Style x:Key="RbVisibilityStyle"
TargetType="{x:Type RadioButton}">
<Setter Property="Visibility">
<Setter.Value>
<MultiBinding Converter="{StaticResource RouterViaTagVisibilityConverter">
<Binding Path="Value1"
RelativeSource="{RelativeSource Self}" />
<Binding Path="Value2"
RelativeSource="{RelativeSource Self}" />
<Binding Path="Tag"
RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>
您是否尝试过使用值转换器编写逻辑并返回Visibility@D_Learning-这就是Rb1Visibility
的作用。它根据Value1
和Value2
返回可见性。每个RadioButton
的实现都会有所不同。您可以尝试使用MultiValueConerter,请参阅此问题,它可能会帮助您。可以传递整个对象,并将参数作为值1和/或值2传递。有关传递参数的信息,请参见以下答案:@D_Learning-我对转换器或其参数没有任何问题。抱歉,我只举了一个示例来简短回答问题。想象一下,同一个RadioButton节点被分配了不同的sayRb2Visibility
Converter@SwDevMan81可见性转换器将在什么时候分配/重新分配?这是在代码中还是在绑定中完成的?最好是在binding@SwDevMan81,不,我知道它在绑定中,我的意思是什么触发了更改绑定?绑定本身永远不会更改。Value1
或Value2
中的更改将“触发”转换器运行并重新确定可见性属性,并相应地更新UI。
<Style x:Key="RbVisibilityStyle"
TargetType="{x:Type RadioButton}">
<Setter Property="Visibility">
<Setter.Value>
<MultiBinding Converter="{StaticResource RouterViaTagVisibilityConverter">
<Binding Path="Value1"
RelativeSource="{RelativeSource Self}" />
<Binding Path="Value2"
RelativeSource="{RelativeSource Self}" />
<Binding Path="Tag"
RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</Setter.Value>
</Setter>
</Style>