C# WPF中的多个Bool-to-Visibility转换器

C# WPF中的多个Bool-to-Visibility转换器,c#,wpf,xaml,C#,Wpf,Xaml,我是WPF的新手。我正在编写基于ToggleSwitch的演示的小应用程序,可在Codeplex上获得: 基本上有4个单选按钮与4个xaml文件绑定(正如我在上面写的链接中的演示)。让我们称它们为Base1.xml、Base2.xml等 然后我想对其中一个文件做同样的事情。 我为3个xamls-Sub1.xml Sub2.xml Sub3.xml添加了Base2.xml 3单选按钮。我复制了逻辑,然后遇到了问题。 其中一个Subx.xml始终可见 我认为这是一个可见/折叠的问题,它应该是可见/隐

我是WPF的新手。我正在编写基于ToggleSwitch的演示的小应用程序,可在Codeplex上获得:

基本上有4个单选按钮与4个xaml文件绑定(正如我在上面写的链接中的演示)。让我们称它们为Base1.xml、Base2.xml等

然后我想对其中一个文件做同样的事情。 我为3个xamls-Sub1.xml Sub2.xml Sub3.xml添加了Base2.xml 3单选按钮。我复制了逻辑,然后遇到了问题。 其中一个Subx.xml始终可见

我认为这是一个可见/折叠的问题,它应该是可见/隐藏的,所以我尝试通过此链接解决此问题:

但它不起作用

以下是我的主要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>

[...]

您能告诉我如何解决我的问题吗?

绑定中的元素名称错误!尝试下面的代码更改,如果有任何问题,请还原

<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}}"/>

你能告诉我怎么解决我的问题吗

顺便说一句,你不必使用转换器。可以直接绑定到visibility属性,该属性可以在视图上公开,也可以在使用MVVM时绑定到VM。例如,我在虚拟机上执行特定逻辑的位置:

public Visibility IsSendAvailable
{
    get { return CanSend ? Visibility.Visible : Visibility.Collapsed; }
    set { _IsSendAvailable = value; OnPropertyChanged("IsSendAvailable"); }
}
然后在Xaml中绑定,例如

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

假设页面的datacontext设置为VM或具有属性
IsSendAvailable
的视图


请注意它是如何使用
INotifyPropertyChange
OnPropertyChanged
方法向世界宣布更改的。我在我的博客上提供了MVVM概述:


因此,除非您将单选按钮绑定到单个属性(可能使用您自己的EnumToBooleanConverter),或者将单选按钮分配给整个屏幕上具有唯一组名的组,否则您可以一次选中多个单选按钮。您的“IsChecked”需要绑定到某个内容。请更新BooltVisibilityConverter的代码。您的代码似乎很好,应该可以正常工作。对不起,我发布为未登录@Vishakh Babu-我重新命名了我的链接,我犯了一个错误,但这部分现在和过去都正常工作。我的子链接有问题,请更新BooltVisibilityConverter的代码。您的代码似乎很好,它应该可以工作,因为expectedIt仍然无法工作。我想我必须读更多关于WPF的书,也许还有更多关于MVVM的书。谢谢。也许你的代码还有其他问题。无论如何,代码是完美的!