none
如何实现这样的绑定? RRS feed

  • 问题

  • 在一个窗体中有一个Ribbon的ToggleButton控件,我希望根据它是否选中,来显示或关闭掉另一个窗体。另一个窗体关闭的时候,toggleButton变为未选中。该如何比较优雅地实现?不用注册许多事件处理程序的那种。用WPF的数据绑定机制或者命令机制能实现吗?
    lehope
    2010年12月9日 3:36

答案

  • 可以很简单的实现,因为WPF的数据绑定可以将任何CLR的属性作为绑定的数据源,所以我们只要创建一个Window示例,然后在他里面新建一个bool属性来表示是否打开,绑定这个属性到 ToggleButton 的IsChecked属性上,用TwoWay模式。 简单的代码示例如下:

    子窗体:

      public partial class TestWindow : Window, INotifyPropertyChanged
      {
        bool _IsVisibility;
        public bool IsVisibility { get { return _IsVisibility; }
          set
          {
            _IsVisibility = value;
    
            if (value) this.Show();
            else this.Hide();
    
            if (PropertyChanged != null)
              PropertyChanged(this,new PropertyChangedEventArgs("IsVisibility"));
          }
        }
    
        public TestWindow()
        {
          InitializeComponent();
    
          this.Closing += new CancelEventHandler(TestWindow_Closing);
        }
    
        void TestWindow_Closing(object sender, CancelEventArgs e)
        {
          e.Cancel = true;
          IsVisibility = false;
          this.Hide();
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
      }
    

    主窗体的XAML:

     <ribbon:RibbonToggleButton x:Name="Button1"
                   LargeImageSource="Images\LargeIcon.png"
                   Label="Button1" 
                   IsChecked="{Binding IsVisibility, Mode=TwoWay}"/>
    

    主窗体的后台代码:

      public partial class MainWindow : RibbonWindow
      {
    
        private TestWindow win = new TestWindow();
        public MainWindow()
        {
          InitializeComponent();
    
          // Insert code required on object creation below this point.
    
          Button1.DataContext = win;
        }
    
        private void RibbonWindow_Closed(object sender, EventArgs e)
        {
          App.Current.Shutdown();
        }
      }
    

    你也可以从我的Skydrive.com上下载一个完整的例子:http://cid-51b2fdd068799d15.office.live.com/self.aspx/.Public/Samples%5E_2010/20101210%5E_BindingToSubWindow.zip

     

    致,

    Bob Bao


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Are you looking for a typical code sample? Please download All in One Code Framework !

    如果有回复帮助并解决了您的问题,请点击 “标记为答复”,如果没有没有帮助,请随时点击“取消答复标记”
    你在为寻找代码示例而苦恼吗?赶快来下载 All in One Code Framework 微软一站式代码框架 吧!
    • 已标记为答案 lehope 2010年12月11日 8:45
    2010年12月9日 16:19
    版主

全部回复

  • 可以很简单的实现,因为WPF的数据绑定可以将任何CLR的属性作为绑定的数据源,所以我们只要创建一个Window示例,然后在他里面新建一个bool属性来表示是否打开,绑定这个属性到 ToggleButton 的IsChecked属性上,用TwoWay模式。 简单的代码示例如下:

    子窗体:

      public partial class TestWindow : Window, INotifyPropertyChanged
      {
        bool _IsVisibility;
        public bool IsVisibility { get { return _IsVisibility; }
          set
          {
            _IsVisibility = value;
    
            if (value) this.Show();
            else this.Hide();
    
            if (PropertyChanged != null)
              PropertyChanged(this,new PropertyChangedEventArgs("IsVisibility"));
          }
        }
    
        public TestWindow()
        {
          InitializeComponent();
    
          this.Closing += new CancelEventHandler(TestWindow_Closing);
        }
    
        void TestWindow_Closing(object sender, CancelEventArgs e)
        {
          e.Cancel = true;
          IsVisibility = false;
          this.Hide();
        }
    
        public event PropertyChangedEventHandler PropertyChanged;
      }
    

    主窗体的XAML:

     <ribbon:RibbonToggleButton x:Name="Button1"
                   LargeImageSource="Images\LargeIcon.png"
                   Label="Button1" 
                   IsChecked="{Binding IsVisibility, Mode=TwoWay}"/>
    

    主窗体的后台代码:

      public partial class MainWindow : RibbonWindow
      {
    
        private TestWindow win = new TestWindow();
        public MainWindow()
        {
          InitializeComponent();
    
          // Insert code required on object creation below this point.
    
          Button1.DataContext = win;
        }
    
        private void RibbonWindow_Closed(object sender, EventArgs e)
        {
          App.Current.Shutdown();
        }
      }
    

    你也可以从我的Skydrive.com上下载一个完整的例子:http://cid-51b2fdd068799d15.office.live.com/self.aspx/.Public/Samples%5E_2010/20101210%5E_BindingToSubWindow.zip

     

    致,

    Bob Bao


    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    Are you looking for a typical code sample? Please download All in One Code Framework !

    如果有回复帮助并解决了您的问题,请点击 “标记为答复”,如果没有没有帮助,请随时点击“取消答复标记”
    你在为寻找代码示例而苦恼吗?赶快来下载 All in One Code Framework 微软一站式代码框架 吧!
    • 已标记为答案 lehope 2010年12月11日 8:45
    2010年12月9日 16:19
    版主
  • 谢谢。我一开始的想法是将主窗体的toggleButton的IsChecked直接和弹出窗体的Visibility属性绑定。使用BooleanToVisibilityConverter。但是BooleanToVisibilityConverter将false映射为Visibility.Collapsed...google了半天,貌似只能写个Converter映射到Visibility.Hidden...权衡了下,最后还是暂时用事件处理程序写了。。。您的解法很赞。谢谢。
    lehope
    2010年12月11日 9:26