簡體   English   中英

通常在MultiBinding節點中替換Converter

[英]Generically replace Converter in MultiBinding node

我有一些RadioButton's ,我想根據ViewModel多個屬性更改其Visibility 每個RadioButton's可見性將基於相同的屬性列表而有所不同。 我有以下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選項更改Converter ,但其他所有內容都將保持不變(所有綁定)。 我不想為此重復所有xaml代碼。 我最初嘗試為RadioButton創建樣式,但是我不知道如何將Converter傳遞給Style資源:

<Style x:Key="RbVisibilityStyle"
       TargetType="{x:Type RadioButton}">
   <Setter Property="Visibility">
      <Setter.Value>
         <MultiBinding Converter="{???? Pass in converter ?????}">
            <Binding Path="Value1"
                     RelativeSource="{RelativeSource Self}" />
            <Binding Path="Value2"
                     RelativeSource="{RelativeSource Self}" />
         </MultiBinding>
      </Setter.Value>
   </Setter>
</Style>

我可以為ViewModel中的每個RadioButton創建一個“ Visibility”屬性,但這會向ViewModel中添加大量代碼並添加PropertyChanged事件處理。 有沒有一種簡單的方法可以使MultiBinding泛泛化,因此我不會在整個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>

如何在此處減少MultiBinding冗余?

想要為每個RadioButton選項更改Converter,

創建一個新的MultiValueConverter,它帶有一個額外的參數(單選按鈕選項),然后根據該選項將調用簡單地路由到相應的轉換器。

可以將選項放在控件的Xaml的Tag屬性中。


我不清楚您提到的選項是什么,因此在我的示例中,讓我們通過其Tag屬性唯一地標識每個單選按鈕,並使用路由轉換器根據提供的Tag查找合適的轉換器。

<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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM