C# 用按钮打开WPF弹出窗口

C# 用按钮打开WPF弹出窗口,c#,wpf,popup,icommand,relaycommand,C#,Wpf,Popup,Icommand,Relaycommand,我试图用一个按钮打开一个弹出窗口,并实现了一个基本的ICommand。按钮绑定到ICommand openpopup命令,而Popup IsOpen属性绑定到“IsOpen”OnPropertyChanged。我的想法是将Popup.IsOpen属性绑定到ICommand,并使其触发OnPropertyChange,但无法使其工作。我想我已经很接近了,但是我想不出来。以下是我目前掌握的代码: #region ICommand Members private ICommand _

我试图用一个按钮打开一个弹出窗口,并实现了一个基本的ICommand。按钮绑定到ICommand openpopup命令,而Popup IsOpen属性绑定到“IsOpen”OnPropertyChanged。我的想法是将Popup.IsOpen属性绑定到ICommand,并使其触发OnPropertyChange,但无法使其工作。我想我已经很接近了,但是我想不出来。以下是我目前掌握的代码:

    #region ICommand Members

    private ICommand _openPopupCommand;
    public ICommand OpenPopupCommand
    {
        get
        {
            if (_openPopupCommand == null)
                _openPopupCommand = new RelayCommand(param => OpenPopupExecute(param));
            return _openPopupCommand;
        }
        set 
        {
            _openPopupCommand = value;
        }
    }

    #endregion

    #region Methods

    public void OpenPopupExecute(object parameter)
    {
        parameter = true;
        OnPropertyChanged("IsOpen");
    }

    #endregion
“弹出”弹出窗口和弹出窗口XAML的按钮:

<Popup x:Name="FieldsPopup" Placement="Center" Width="400" Height="250" IsOpen="{Binding IsOpen}">
                    <StackPanel>
                        <TextBlock Background="LightBlue" HorizontalAlignment="Center" VerticalAlignment="Center" Height="250" Width="350" TextAlignment="Center" >This is a popup</TextBlock>
                    </StackPanel>
                </Popup>
<Button Name="button_PatientIdentifierList" Width="23" Height="23" Grid.Column="2" Foreground="Black" Background="#FFCDCDCD" BorderBrush="#FF707070" Margin="3.4,4,4,0" VerticalAlignment="Top" Command="{Binding OpenPopupCommand}"/>

这是一个弹出窗口

您正在引发PropertyChange通知,但我没有看到您在任何地方实际更改属性

除非我弄错了,否则这里的代码接受
命令参数
(这里称为
参数
),并将其设置为
true

public void OpenPopupExecute(object parameter)
{
    parameter = true;
    OnPropertyChanged("IsOpen");
}
但是,在XAML中,Button.CommandParameter没有绑定到任何对象

<Button Command="{Binding OpenPopupCommand}"/>

顺便说一句,我真的不喜欢WPF的默认
PopupControl
,如果你决定你也讨厌WPF的默认
PopupControl
),我想如果你在代码方面提供多一点上下文,这会很有价值。你到底想说什么“Popup IsOpen属性绑定到”IsOpen“OnPropertyChanged”?听起来好像您想说您在依赖项属性和方法之间进行了绑定——这是不可能的,也没有意义。(还要注意,Popup.IsOpen不是一个属性,它是一个依赖项属性。属性完全是其他的东西…)也请发布您的xaml。您的代码看起来不错,但不完整,但如果没有您的xaml标记,我们无法判断。我希望OnPropertyChanged(“IsOpen”)在INotifyPropertyChanged接口中引发事件,但我们在这里猜测=)。请完成代码和xaml。@User1489726很抱歉,..
参数是OpenPopupExecute方法的参数变量,因此是该方法的局部变量。为该变量指定不同的值在该方法之外没有任何效果d、 …因此,您对CommandParameter的思考是没有根据的。无论如何,我只是吹毛求疵。关于IsOpen的另一个更重要的部分当然是正确的。(好的,再吹毛求疵一点:保护setter是很好的,这样如果属性设置为它已经具有的值,则不会引发事件:))@Rachel我很感谢你的PopupControl的customer UserControl版本!我是个新手(如果你不知道的话)可能会迷路,但我会看一看!另外,我有一些类似于您发布的解决方案,唯一的区别是OpenPopupExecutue主体没有IsOpen=true;part。我做了更改,我们成功了!谢谢大家的帮助!@Rachel我同意默认的弹出控件不太好用,我已经做了和你一样。它不是可视化树的一部分,控件也有很多问题。特别是在XBAP应用程序中。。。
private bool _isOpen;
public bool IsOpen
{
    get
    {
        return _isOpen;
    }
    set 
    {
        _isOpen = value;
        OnPropertyChanged("IsOpen");
    }
}

public void OpenPopupExecute(object parameter)
{
    IsOpen = true; // Will call OnPropertyChanged in setter
}