2017-07-18 307 views
0

我有一個動態的ListView使用DataTemplate如下:WPF綁定到一個單選按鈕組名

<ListView.ItemTemplate> 
<DataTemplate> 
    <Border BorderThickness="0,0,0,1" BorderBrush="#ccc"> 
     <RadioButton GroupName="MyRadioButtonGroup"> 
      <StackPanel Orientation="Horizontal" Margin="0,0,0,5" Width="{Binding ActualWidth, ElementName=CheckoutGrid}"> 
       <TextBlock Text="{Binding Path=Test1, StringFormat='{}{0} - '}" /> 
       <TextBlock Text="{Binding Path=Test2, StringFormat='{} test {0} - '}" /> 
       <TextBlock Text="{Binding Path=Test, StringFormat='{} test {0}'}" /> 
      </StackPanel> 
     </RadioButton> 
    </Border> 
</DataTemplate> 
</ListView.ItemTemplate> 

我想有一個按鈕禁用,直到單選按鈕IsChecked之一:

<RadioButton Padding="15,10" VerticalAlignment="Center"> 
<RadioButton.Style> 
    <Style TargetType="RadioButton" BasedOn="{StaticResource styleToggleButton4}"> 
     <Setter Property="Visibility" Value="Collapsed" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=MyRadioButtonGroup, Path=IsChecked}" Value="False"> 
        <Setter Property="IsEnabled" Value="False" /> 
       </DataTrigger> 
      </Style.Triggers> 
    </Style> 
</RadioButton.Style> 
<TextBlock FontWeight="SemiBold" FontSize="14" Margin="0">NEXT</TextBlock> 
</RadioButton> 

所以問題是我不知道如何正確綁定到RadioButton GroupName="MyRadioButtonGroup"。您會在上面的DataTrigger中看到我嘗試Binding="{Binding ElementName=MyRadioButtonGroup, Path=IsChecked}" Value="False",但這不適用於我,因爲它顯然是GroupName而不是x:Name

關於如何正確處理此問題的任何建議?如果可能的話,我寧願想在前端處理這個問題。

回答

0

您可以將您的單選按鈕綁定到命令,然後使用isChecked作爲參數。然後綁定到基於此的布爾值。我認爲這可能是更多的解決方法。

<RadioButton 
     Command="{Binding MyCommand}" 
     CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" 
     GroupName="radio" /> 
<RadioButton 
     Command="{Binding MyCommand}" 
     CommandParameter="{Binding RelativeSource={RelativeSource Self}, Path=IsChecked}" 
     GroupName="radio" /> 

然後在後面的代碼或VM,它需要實現ICommand接口和INotifyPropertyChanged的

public bool IsChecked 
    { 
     get { return isChecked;} 
     set 
     { 
      isChecked = value; 
      OnPropertyChanged(); 
     } 
    } 

    private void OnMyCommand(object obj) 
    { 
     if(obj is bool) 
     { 
      IsChecked = (bool)obj; 
     } 
    } 
0

一組具有您可以綁定到任何IsChecked財產。

如果您沒有記錄至少有一個選中的RadioButton的源屬性和「我想在視圖中處理這個問題」 - 您可以編寫一些代碼只需將ListViewTag屬性設置爲true/false,具體取決於是否選擇了RadioButton。這是一個班輪:

private void ListView_Checked(object sender, RoutedEventArgs e) => lv.Tag = true; 

<ListView x:Name="lv" ToggleButton.Checked="ListView_Checked"> 
    <ListView.ItemTemplate> 
     ... 
    <ListView.ItemTemplate> 
</ListView> 

<RadioButton Padding="15,10" VerticalAlignment="Center"> 
    <RadioButton.Style> 
     <Style TargetType="RadioButton" BasedOn="{StaticResource styleToggleButton4}"> 
      <Setter Property="Visibility" Value="Collapsed" /> 
      <Style.Triggers> 
       <DataTrigger Binding="{Binding ElementName=lv, Path=Tag}" Value="True"> 
        <Setter Property="Visibility" Value="Visible" /> 
       </DataTrigger> 
      </Style.Triggers> 
     </Style> 
    </RadioButton.Style> 
    <TextBlock FontWeight="SemiBold" FontSize="14" Margin="0">NEXT</TextBlock> 
</RadioButton>