繁体   English   中英

通过与 RadioButton 绑定未更新可见性属性

[英]Visibility property not updated through binding with RadioButton

我有两个 XAML 对象,我想用单选按钮的状态更改它们的可见性。 但是我不能让他们工作。 我已经解决了这个问题的“类似问题”,但没有设法解决。

对于这两个命令肯定会触发 - 我在 UpdateVisibility 上放置了一个断点来检查,并且 switch 语句按预期工作。

第一次尝试 - 可见性绑定

这什么也没做,并且没有 FallbackValue 将显示两个元素(即使在构造函数中设置了 Visibilities。

特性:

public Visibility TreeViewVisibility { get; set; }
public Visibility ContentViewVisibility { get; set; }

命令:

public ICommand VisibilityCommand
{
    get { return visibilityCommand ?? (visibilityCommand = new RelayCommand(UpdateVisibility)); }
}

public void UpdateVisibility(object o)
{
    switch (o.ToString())
    {
        case "XMLView":
            Console.WriteLine("XMLView");
            TreeViewVisibility = Visibility.Visible;
            ContentViewVisibility = Visibility.Collapsed;
            break;
        case "TextView":
            Console.WriteLine("TextView");
            TreeViewVisibility = Visibility.Collapsed;
            ContentViewVisibility = Visibility.Visible;
            break;
    }
    OnPropertyChanged(nameof(TreeViewVisibility));
    OnPropertyChanged(nameof(ContentViewVisibility));
}

XAML:

<TreeView Name="xmlTree" ItemTemplate="{StaticResource treeViewTemplate}" ItemsSource="{Binding Document}" Height="600" Visibility="{Binding TreeViewVisibility, FallbackValue=Visible}"/>
<TextBlock Text="{Binding Content}" Visibility="{Binding ContentViewVisibility, FallbackValue=Collapsed}" Height="600"/>
...
<RadioButton GroupName="DisplayType" Command="{Binding VisibilityCommand}" CommandParameter="XMLView" IsChecked="True" Content="XML View" Margin="0,0,5,0"/>
<RadioButton GroupName="DisplayType" Command="{Binding VisibilityCommand}" CommandParameter="TextView" Content="Text View" Margin="5,0,0,0"/>

第二次尝试 - 数据触发器

然后我尝试通过将属性更改为布尔值(以及 ViewModel 中的相关内容)将其设置为数据触发器。 这导致默认视图为 TreeView,TextBlock 默认折叠,但单击单选按钮时可见性没有改变。

特性:

public bool TreeViewVisibility { get; set; }
public bool ContentViewVisibility { get; set; }

命令:

public ICommand VisibilityCommand
{
    get { return visibilityCommand ?? (visibilityCommand = new RelayCommand(UpdateVisibility)); }
}

public void UpdateVisibility(object o)
{
    switch (o.ToString())
    {
        case "XMLView":
            Console.WriteLine("XMLView");
            TreeViewVisibility = true;
            ContentViewVisibility = false;
            break;
        case "TextView":
            Console.WriteLine("TextView");
            TreeViewVisibility = true;
            ContentViewVisibility = false;
            break;
    }
    OnPropertyChanged(nameof(TreeViewVisibility));
    OnPropertyChanged(nameof(ContentViewVisibility));
}

XAML:

<TreeView Name="xmlTree" ItemTemplate="{StaticResource treeViewTemplate}" ItemsSource="{Binding Document}" Height="600">
    <TreeView.Style>
        <Style TargetType="TreeView">
            <Setter Property="Visibility" Value="Visible"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding TreeViewVisibility}" Value="false">
                    <Setter Property="Visibility" Value="Collapsed"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TreeView.Style>
</TreeView>
<TextBlock Text="{Binding Content}" Height="600">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Setter Property="Visibility" Value="Collapsed"/>
            <Style.Triggers>
                <DataTrigger Binding="{Binding ContentViewVisibility}" Value="true">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>

您可以在 XAML 中完成所有这些操作,而无需任何绑定到您的视图 model,使用DataTrigger就像您开始:

<StackPanel>
    <TextBlock Text="XML View" Margin="5">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Setter Property="Visibility" Value="Hidden"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=radio1, Path=IsChecked}" Value="True">
                        <Setter Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    <TextBlock Text="Text View" Margin="5">
        <TextBlock.Style>
            <Style TargetType="TextBlock">
                <Setter Property="Visibility" Value="Hidden"/>
                <Style.Triggers>
                    <DataTrigger Binding="{Binding ElementName=radio2, Path=IsChecked}" Value="True">
                        <Setter Property="Visibility" Value="Visible"/>
                    </DataTrigger>
                </Style.Triggers>
            </Style>
        </TextBlock.Style>
    </TextBlock>
    <RadioButton x:Name="radio1" GroupName="DisplayType" IsChecked="True" Content="XML View" Margin="5"/>
    <RadioButton x:Name="radio2" GroupName="DisplayType" Content="Text View" Margin="5"/>
</StackPanel>

您可以在文档中阅读有关ElementName绑定的更多信息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM