[英]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.