0

我有一个扩展器控件,一次只能打开一个扩展器。如果用户点击一个展开器,另一个展开器就会折叠。代码如下:

我有一个带有以下代码的 Converter.cs 文件

public class OppositeConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{

    return !(bool)value;
}

public object ConvertBack(object value, Type targetType, object parameter, string language)
{
    return !(bool)value;
}
}

我有一个包含以下代码的 MainPageViewModel.cs 文件:

public class MainPageViewModel
{
   public MainPageViewModel()
{

}
   private bool _isExpend;


   public bool IsExpend
   {
    get
    {
        return _isExpend;
    }
    set
    {
        _isExpend = value;
        RaisePropertyChanged(nameof(isExpend));
    }
}

}

我有一个 MainPage.xaml 文件

 <Page.DataContext>
    <local:MainPageViewModel x:Name="ViewModel" />
</Page.DataContext>
 <Page.Resources>
        <local:OppositeConverter x:Key="OppositeConverter" />
  </Page.Resources>
 <StackPanel>
      <controls:Expander
       x:Name="Expander1"
       Content = "Expander 1 content"
       IsExpanded="{x:Bind IsExpend, Converter={StaticResource OppositConverter},Mode=TwoWay}">
   </controls:Expander>

   <controls:Expander
       x:Name="Expander2"
       Content = "Expander 2 content"
       IsExpanded="{x:Bind IsExpend, Mode=TwoWay}">
   </controls:Expander>     
</StackPanel>

我可以帮助了解转换器如何在这里工作吗?什么时候调用convert,什么时候调用convertback?为什么只有第一个扩展器使用转换器而不是第二个?我非常感谢帮助理解此代码的流程。

4

1 回答 1

1

什么时候调用convert,什么时候调用convertback?

该类OppositeConverter允许您通过继承来在源和目标之间转换数据格式IValueConverter。当点击一个控件改变状态时,我们使用 OppositeConverter将另一个控件的状态值设置为相反的值。

Convert当您单击第二个控件时调用该方法。工作流程是这样的:

  1. 单击第二个控件展开或折叠它,_isExpend第二个控件的值将发生变化,并RaisePropertyChanged调用方法通知值发生变化。
  2. 第一个_isExpend控件通过调用该Convert方法获取第二个控件的相反值,使得第一个控件的折叠或展开状态与第二个控件相反。

ConvertBack当您单击第一个控件时调用该方法。工作流程是这样的:

  1. 单击第一个控件以展开或折叠它,ConvertBack调用该方法以获取相反的值_isExpend
  2. 将调用该RaisePropertyChanged方法通知值发生变化,第二个控件的值与第一个控件的值_isExpend相反_isExpend

为什么只有第一个扩展器使用转换器而不是第二个?

一个Converter可以将另一个控件的值反转一次,这正是我们所需要的。如果你在两个控件中都使用它,两个Converter会使两个控件的值相同,当你单击其中一个时,两个控件的状态将保持不变。

于 2020-10-07T09:03:29.797 回答