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