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节点被分配了不同的say
Rb2Visibility
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>