1

我有一个 UserControl,它包含 bool 属性 A。在包含该 UserControl 的主窗口中,我必须启用/禁用一个按钮取决于 A 的值。我试图将 A 作为公共和绑定按钮,如下所示:

<Button IsEnabled="{Binding MyUserControl.A}"/>

在 UserControl 中,我为 Property A 设置了 PropertyChangedEventHandler,如下所示:

private bool _a;
public bool A
{
    get
    {
         return _a;
    }
         set
    {
         if (_a == value)
             return
         _a = value;
         OnPropertyChanged("A");
    }
}

看起来不错。但我不知道为什么它不起作用。似乎我缺乏一些实现来在主窗口与其用户控件之间进行通信(因为使用 OnPropertyChanged,用户控件内的所有绑定都可以正常工作)。

我有一些解决方案是 1. 使用 Messenger 从 Usercontrol 发送消息,内容为 A,主控件将捕获并将值设置为按钮的 IsEnabled。2. 创建一个事件并在 A 的值发生变化时提出它。

您对这个问题以及如何解决它有任何想法吗?您认为以下 2 种解决方案效果如何,或者您有其他建议吗?

谢谢阅读。

<<编辑>>这个问题解决了。在代码隐藏中设置用户控件的数据上下文时是我的错误,并且不承认我已经在数据模板中设置了它们。--> 所以,复制使用户控件的视图模型初始化了 2 次。--> 不知何故,它使 NotifyPropertyChange 工作不正确。

对不起,这个问题的标题不适合这个愚蠢的错误。看来我采取了正确的方法来解决标题问题。感谢您的阅读和建议。

4

3 回答 3

2

在 wpf 中显示用户控件的另一种方法。在此处查看此 StackOverflow 讨论

INotifyPropertyChanged 的​​备用:绑定的依赖属性。

//用户控件

public partial class UserControl1 : UserControl
{
   public bool A
    {
        get { return (bool)GetValue(AProperty); }
        set { SetValue(AProperty, value); }
    }

    public static readonly DependencyProperty AProperty =
        DependencyProperty.Register("A", typeof(bool), typeof(UserControl1), new UIPropertyMetadata(false));

    public UserControl1()
    {
        InitializeComponent();
        DataContext = this;
    }
}

}

//主窗口.xaml

 <Window x:Class="WpfApplication1.MainWindow"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:src="clr-namespace:WpfApplication1"
      Height="300" Width="300">
    <StackPanel>
      <src:UserControl1 x:Name="myControl" />
      <Button IsEnabled="{Binding A, ElementName=myControl}" />
    </StackPanel>

于 2013-01-15T10:02:56.057 回答
1

绑定表达式始终使用DataContext作为评估绑定路径的基础。因此,在您的情况下,DataContext必须是窗口本身,您可以在代码隐藏文件的窗口的构造函数中设置它:

this.DataContext = this;

另请注意,要工作您的窗口需要有一个名为MyUserControl.

另一种选择是为您可能在 XAML 中实例化的 MyUserControl 实例提供一个名称,然后ElementName在绑定表达式中使用:

<Grid>
    <loc:MyUserControl Name="myUserControl" />
    <Button IsEnabled="{Binding A, ElementName=myUserControl}" />
</Grid>
于 2013-01-15T09:22:58.223 回答
1

您需要通过在资源中声明它来创建 UserControl 的实例并将其设置为数据上下文,然后您才能使用它。尝试这个。

<Window.Resources>
    <WpfApplication2:UserControl1 x:Key="MyUserControl"/>
</Window.Resources>

<StackPanel DataContext="{StaticResource MyUserControl}">
    <Button IsEnabled="{Binding Path=A}" Content="Test" Height="20" />
</StackPanel>
于 2013-01-15T09:41:45.077 回答