将 UserControl 中的 MenuItem 绑定到主窗口中的折叠框架

namg_engr

我对 WPF 数据绑定有点陌生,所以请耐心等待。我想要的行为是在 UserControl 中绑定一个 MenuItem 并使用它来折叠 MainWindow 中的框架。我正在使用和 booltoVisibility 转换器来帮助进行类型转换。当我运行代码时,框架不会折叠。在输出窗口中,我收到错误“无法将目标中的值保存回源...系统参数异常:“True”不是 Property CollapseFrame 的有效值”。我认为这可能与我构建依赖属性的方式有关,但我无法弄清楚。

主窗口.xaml

<Window x:Class="TestBooleanToVisibilityConverter.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:TestBooleanToVisibilityConverter"
    xmlns:local1="clr-namespace:WpfApp1"
    Title="MainWindow"
    SizeToContent="WidthAndHeight" 
    DataContext="{Binding RelativeSource={RelativeSource Self}}">

<Grid Margin="30">
    <Grid.RowDefinitions>
        <RowDefinition Height="Auto" />
        <RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.Resources>
        <local:BoolToVisibleOrHidden x:Key="BoolToVisConverter" Collapse="True" Reverse="True" />
    </Grid.Resources>
    <Frame 
        Grid.Column="0" 
        Grid.Row="0"
        MinWidth= "200"
        MinHeight= "20"
        BorderBrush="Gray"
        BorderThickness="3"
        Visibility="{Binding FrameIsVisible, Converter={StaticResource BoolToVisConverter}}" >
    </Frame>

    <Grid Grid.Row="1">
        <local1:Menu
        CollapseFrame="{Binding FrameIsVisible, Converter={StaticResource BoolToVisConverter}}" >
        </local1:Menu>
    </Grid>

</Grid>

主窗口.xaml.cs

using System;  
using System.Collections.Generic;  
using System.Linq;  
using System.Text;  
using System.Threading.Tasks;  
using System.Windows;  
using System.Windows.Controls;  
using System.Windows.Data;  
using System.Windows.Documents;  
using System.Windows.Input;  
using System.Windows.Media;  
using System.Windows.Media.Imaging;  
using System.Windows.Navigation;  
using System.Windows.Shapes;  
using WpfApp1;  

namespace TestBooleanToVisibilityConverter
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            FrameIsVisible = false;
        }

        public bool FrameIsVisible { get; set; }
    }
}

菜单.xaml

    <UserControl x:Class="WpfApp1.Menu"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApp1"
             x:Name="myUserControl"
             mc:Ignorable="d">
    <Menu >
        <MenuItem Header="_File">
            <MenuItem x:Name="HideFrame" Header="Hide Frame" IsCheckable="True" IsChecked="{Binding ElementName=myUserControl, Path=CollapseFrame}"  />
        </MenuItem>
    </Menu>
</UserControl>

菜单.xaml.cs

using System.Windows;
using System.Windows.Controls;

namespace WpfApp1
{
    /// <summary>
    /// Interaction logic for Menu.xaml
    /// </summary>
    public partial class Menu : UserControl
    {
        public Menu()
        {
            InitializeComponent();
        }

        public static readonly DependencyProperty CollapseFrameProperty =
            DependencyProperty.Register("CollapseFrame",
            typeof(Visibility),
            typeof(Menu),
            new FrameworkPropertyMetadata(Visibility.Visible));

        public Visibility CollapseFrame
        {
            get { return (Visibility)GetValue(CollapseFrameProperty); }
            set { SetValue(CollapseFrameProperty, value); }
        }
    }
}

BooleanToVisibleOrHidden.cs

    using System;
using System.Windows.Data;
using System.Windows;

namespace TestBooleanToVisibilityConverter {
    class BoolToVisibleOrHidden : IValueConverter
    {
        #region Constructors

        public BoolToVisibleOrHidden() { }
        #endregion

        #region Properties
        public bool Collapse { get; set; }
        public bool Reverse { get; set; }
        #endregion

        #region IValueConverter Members
        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            bool bValue = (bool)value;

            if (bValue != Reverse)
            {
                return Visibility.Visible;
            }
            else
            {
                if (Collapse)
                    return Visibility.Collapsed;
                else
                    return Visibility.Hidden;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            Visibility visibility = (Visibility)value;

            if (visibility == Visibility.Visible)
                return !Reverse;
            else
                return Reverse;
        }
        #endregion
    }
}
毫米8

你需要一个转换器,它把来自一个VisibilityBoolean

public class VisibleOrHiddenToBool : IValueConverter
{
    #region Properties
    public bool Collapse { get; set; }
    public bool Reverse { get; set; }
    #endregion

    #region IValueConverter Members
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        Visibility visibility = (Visibility)value;

        if (visibility == Visibility.Visible)
            return !Reverse;
        else
            return Reverse;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        bool bValue = (bool)value;

        if (bValue != Reverse)
        {
            return Visibility.Visible;
        }
        else
        {
            if (Collapse)
                return Visibility.Collapsed;
            else
                return Visibility.Hidden;
        }
    }
    #endregion
}

菜单.xaml:

<Grid>
    <Grid.Resources>
        <local:VisibleOrHiddenToBool x:Key="converter" />
    </Grid.Resources>
    <Menu >
        <MenuItem Header="_File">
            <MenuItem x:Name="HideFrame" Header="Hide Frame" IsCheckable="True" 
                          IsChecked="{Binding ElementName=myUserControl, Path=CollapseFrame, Converter={StaticResource converter}}"  />
        </MenuItem>
    </Menu>
</Grid>

然后,您应该将绑定到FrameIsVisible窗口中属性设置TwoWay

<local:Menu x:Name="menu" CollapseFrame="{Binding FrameIsVisible, Converter={StaticResource BoolToVisConverter}, Mode=TwoWay}" />

最后,您还需要实现该INotifyPropertyChanged接口并PropertyChanged在窗口中引发通知:

public partial class MainWindow : Window, INotifyPropertyChanged
{
    public MainWindow()
    {
        InitializeComponent();
    }

    private bool _frameIsVisible;
    public bool FrameIsVisible
    {
        get { return _frameIsVisible; }
        set { _frameIsVisible = value; OnPropertyChanged(); }
    }

    public event PropertyChangedEventHandler PropertyChanged;
    private void OnPropertyChanged([CallerMemberName] String propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将颜色绑定到 UserControl 中的 DependencyProperty

来自分类Dev

WPF将Usercontrol属性绑定到主窗口

来自分类Dev

将WPF RelayCommand从DataTemplate绑定到UserControl中的按钮

来自分类Dev

将类属性绑定到MVVM中的UserControl

来自分类Dev

如何将UserControl绑定到另一个UserControl中?

来自分类Dev

无法绑定到主窗口中的usercontrol属性

来自分类Dev

从WPF / C#中的UserControl将子项添加到父窗口中的StackPanel中

来自分类Dev

从WPF / C#中的UserControl将子项添加到父窗口中的StackPanel中

来自分类Dev

将MenuItem的IsChecked绑定到TabItem的isSelected

来自分类Dev

将MenuItem的#items绑定到CompositeCollection中的可见性

来自分类Dev

将xaml文件导入到usercontrol中

来自分类Dev

从 UserControl 中的 Element 绑定

来自分类Dev

将UserControl的DataContext绑定到子ViewModel

来自分类Dev

将UserControl属性绑定到Window属性

来自分类Dev

将DataGrid.Columns集合绑定到自定义WPF UserControl中的祖先

来自分类Dev

将扩展文本框中的依赖项属性绑定到UserControl

来自分类Dev

将 Canvas.Size 绑定到父 UserControl,然后在代码中设置 Canvas.Size

来自分类Dev

如何将值从窗口传递到WPF中的UserControl

来自分类Dev

如何将值从窗口传递到WPF中的UserControl

来自分类Dev

将焦点放在UserControl中的TextBox上

来自分类Dev

绑定UserControl中的工具提示

来自分类Dev

在 UserControl 中绑定文本块

来自分类Dev

如何将DataGrid的GroupItem的ContextMenu的MenuItem绑定到窗口或控件的DataContext?

来自分类Dev

将ListViewItem ContextMenu MenuItem命令绑定到ListView的ItemsSource的ViewModel

来自分类Dev

将项目绑定到MenuItem-> use命令

来自分类Dev

将 ICommand 绑定到 MenuItem 并分配快捷方式

来自分类Dev

将WPF窗口投射到WPF UserControl

来自分类Dev

将WPF窗口投射到WPF UserControl

来自分类Dev

如何使用依赖项属性将图像传递到UserControl中的按钮

Related 相关文章

  1. 1

    将颜色绑定到 UserControl 中的 DependencyProperty

  2. 2

    WPF将Usercontrol属性绑定到主窗口

  3. 3

    将WPF RelayCommand从DataTemplate绑定到UserControl中的按钮

  4. 4

    将类属性绑定到MVVM中的UserControl

  5. 5

    如何将UserControl绑定到另一个UserControl中?

  6. 6

    无法绑定到主窗口中的usercontrol属性

  7. 7

    从WPF / C#中的UserControl将子项添加到父窗口中的StackPanel中

  8. 8

    从WPF / C#中的UserControl将子项添加到父窗口中的StackPanel中

  9. 9

    将MenuItem的IsChecked绑定到TabItem的isSelected

  10. 10

    将MenuItem的#items绑定到CompositeCollection中的可见性

  11. 11

    将xaml文件导入到usercontrol中

  12. 12

    从 UserControl 中的 Element 绑定

  13. 13

    将UserControl的DataContext绑定到子ViewModel

  14. 14

    将UserControl属性绑定到Window属性

  15. 15

    将DataGrid.Columns集合绑定到自定义WPF UserControl中的祖先

  16. 16

    将扩展文本框中的依赖项属性绑定到UserControl

  17. 17

    将 Canvas.Size 绑定到父 UserControl,然后在代码中设置 Canvas.Size

  18. 18

    如何将值从窗口传递到WPF中的UserControl

  19. 19

    如何将值从窗口传递到WPF中的UserControl

  20. 20

    将焦点放在UserControl中的TextBox上

  21. 21

    绑定UserControl中的工具提示

  22. 22

    在 UserControl 中绑定文本块

  23. 23

    如何将DataGrid的GroupItem的ContextMenu的MenuItem绑定到窗口或控件的DataContext?

  24. 24

    将ListViewItem ContextMenu MenuItem命令绑定到ListView的ItemsSource的ViewModel

  25. 25

    将项目绑定到MenuItem-> use命令

  26. 26

    将 ICommand 绑定到 MenuItem 并分配快捷方式

  27. 27

    将WPF窗口投射到WPF UserControl

  28. 28

    将WPF窗口投射到WPF UserControl

  29. 29

    如何使用依赖项属性将图像传递到UserControl中的按钮

热门标签

归档