2016-04-29 3 views
1

Я довольно новичок в WPF. Я пишу небольшую пробную версию на основе Demo из ToggleSwitch avaiable на Codeplex: https://toggleswitch.codeplex.com/Несколько конвертеров Bool to Visibility в WPF

В основном есть 4 кнопки радиосвязи, связанные с 4 файлами xaml (как показано в демонстрации из ссылки, которую я написал выше). Давайте назовем их Base1.xml, Base2.xml и т. Д.

Тогда я хотел сделать то же самое для одного из этих файлов. Я положил в Base2.xml 3 переключателя для 3 xamls - Sub1.xml Sub2.xml Sub3.xml. Я скопировал логику, а затем столкнулся с проблемой. Один из Subx.xml всегда отображается.

я, хотя, что это видно/разрушилась проблема, и она должна быть видимой/скрыт, поэтому я попытался решения по этой ссылке: http://www.rhyous.com/2011/02/22/binding-visibility-to-a-bool-value-in-wpf/

Но это не работает ...

Вот моя главная XAML:

<ResourceDictionary> 
    [...] 
     <BooleanToVisibilityConverter x:Key="VisibilityConverter"/> 
</ResourceDictionary> 
<Grid> 
    <Grid Margin="10"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <StackPanel x:Name="LinksStackPanel" Orientation="Horizontal"> 
      <RadioButton Style="{StaticResource LinkStyle}" x:Name="VLink1" Content="LINK1" Margin="0,0,25,0" IsChecked="True" /> 
      <RadioButton Style="{StaticResource LinkStyle}" x:Name="VLink2" Content="LINK2" Margin="0,0,25,0"/> 
      <RadioButton Style="{StaticResource LinkStyle}" x:Name="VLink3" Content="LINK3" Margin="0,0,25,0"/> 
      <RadioButton Style="{StaticResource LinkStyle}" x:Name="VLink4" Content="LINK4" Margin="0,0,25,0"/> 
     </StackPanel> 
     <Grid Grid.Row="1" Margin="0,10,0,0"> 
      <MyApp:Link1 Visibility="{Binding ElementName=Link1, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
      <MyApp:Link2 Visibility="{Binding ElementName=Link2, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
      <MyApp:Link3 Visibility="{Binding ElementName=Link3, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
      <MyApp:Link4 Visibility="{Binding ElementName=Link4, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
     </Grid> 
    </Grid> 
</Grid> 

А вот мой Link2.xaml:

<UserControl.Resources> 
    <ResourceDictionary> 
     [...] 
     <BooleanToVisibilityConverter x:Key="VisibilityConverter"/> 
    </ResourceDictionary> 
    </UserControl.Resources> 

    <Grid Margin="10"> 
     <Grid.RowDefinitions> 
      <RowDefinition Height="Auto"/> 
      <RowDefinition Height="*"/> 
     </Grid.RowDefinitions> 

     <StackPanel x:Name="LinksStackPanel" Orientation="Horizontal" Margin="0,0,0,0" > 
      <RadioButton Style="{StaticResource LinkStyle}" x:Name="vSubLink1"  Content="SubLink1"  Margin="25,0,25,0"/> 
      <RadioButton Style="{StaticResource LinkStyle}" x:Name="vSubLink2" Content="SubLink2" Margin="0,0,25,0"/> 
      <RadioButton Style="{StaticResource LinkStyle}" x:Name="vSubLink3"  Content="SubLink3"  Margin="0,0,25,0"/> 

     </StackPanel> 
     <Grid Grid.Row="1" Margin="0,10,0,0"> 
     <MyApp:SubLink1 Visibility="{Binding ElementName=vSubLink1, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
     <MyApp:SubLink2 Visibility="{Binding ElementName=vSubLink2, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
     <MyApp:SubLink3 Visibility="{Binding ElementName=vSubLink3, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
     </Grid> 
    </Grid> 

Не могли бы вы рассказать мне, как решить мою проблему?

+0

Так что, если вы не ваша кнопка радио привязывается к одному свойству, возможно, с вашей собственной EnumToBooleanConverter или назначить кнопки радио в группу с уникальным именем группы для на весь экран, вы можете сразу установить несколько переключателей. Ваш «IsChecked» должен быть связан с чем-то. –

+0

Пожалуйста, обновите код BoolToVisibilityConverter. Ваш код кажется прекрасным, и он должен работать должным образом. – ViVi

ответ

1

Неверное имя элемента в привязке! Попробуйте изменить код ниже и верните, если возникнут проблемы.

<MyApp:Link1 Visibility="{Binding ElementName=VLink1, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
<MyApp:Link2 Visibility="{Binding ElementName=VLink2, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
<MyApp:Link3 Visibility="{Binding ElementName=VLink3, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
<MyApp:Link4 Visibility="{Binding ElementName=VLink4, Path=IsChecked, Converter={StaticResource VisibilityConverter}}"/> 
+0

Извините, я публикую как не зарегистрированный. @ Вишах Бабу - я переименовал свою ссылку, и я допустил ошибку, но эта часть и работает нормально. У меня есть проблемы с моими подзадачами. – FindResults

+0

Пожалуйста, обновите код BoolToVisibilityConverter.Ваш код кажется прекрасным, и он должен работать должным образом – ViVi

+0

Он по-прежнему не работает. Я думаю, что мне нужно больше узнать о WPF и, возможно, больше о MVVM. Спасибо, в любом случае. – FindResults

0

Не могли бы вы сказать мне, как решить мою проблему?

Как в стороне ... вам необязательно использовать конвертер. Можно напрямую связать свойство видимости, либо отображаться в представлении, либо если вы используете MVVM для виртуальной машины. Такие, как, когда я делаю определенную логику на моей виртуальной машине:

public Visibility IsSendAvailable 
{ 
    get { return CanSend ? Visibility.Visible : Visibility.Collapsed; } 
    set { _IsSendAvailable = value; OnPropertyChanged("IsSendAvailable"); } 
} 

Затем связать в вашем Xaml, такие как

<MyApp:SubLink1 Visibility="{Binding IsSendAvailable}"/> 

при условии, что DataContext на страницы устанавливается на виртуальную машину или View со свойством IsSendAvailable.


Обратите внимание, как он используется INotifyPropertyChangeOnPropertyChanged метод, чтобы объявить изменения в мире. Я обеспечиваю обзор MVVM в моем блоге:

Xaml: ViewModel Main Page Instantiation and Loading Strategy for Easier Binding

Смежные вопросы