用户控制内容Presenter绑定问题

时间:2014-04-09 13:58:37

标签: wpf user-controls contentpresenter

我正在创建用作其他控件容器的用户控件。我在StackOverflow上找到了代码,并使用该示例创建了用户控件。 这是我的用户控件的代码。

 <UserControl x:Class="ClassLibrary1.UserControl1"
         xmlns:local="clr-namespace:ClassLibrary1"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
 <UserControl.Template>
    <ControlTemplate>
        <StackPanel>
            <Button Content="Custom Control Text Area 1" IsEnabled="{Binding IsEnabled}"  />
            <ContentPresenter Content="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Content}"/>
            <TextBlock Text="Custom Control Text Area 2" />
        </StackPanel>
    </ControlTemplate>
</UserControl.Template>

背后的代码如下

namespace ClassLibrary1
{
   public partial class UserControl1 : UserControl
   {
       public UserControl1()
       {
          InitializeComponent();
       }
   }
}

}

然后我在其他Windows应用程序项目中添加了此用户控件,并在此用户控件中添加了按钮,因此代码如下所示

<StackPanel>
    <l:UserControl1>
        <StackPanel >
            <Button Click="Button_Click" Content="Click"/>
            <Button Content="My Control's Content" IsEnabled="{Binding Isbuttonenable}"/>
        </StackPanel>
    </l:UserControl1>

</StackPanel>

现在从我的Windows应用程序项目工作正常,Button控件能够基于Isbuttonenable valye启用/禁用。

现在我更新了用户控件并将ViewModel添加到用户控件。这是用户控制代码背后的代码

namespace ClassLibrary1
{
   public partial class UserControl1 : UserControl
   {
       UserControl1ViewModel model = new UserControl1ViewModel();
       public UserControl1()
       {
          InitializeComponent();
         this.DataContext = model;
       }
    }
} 

现在,当我在Windows应用程序项目中使用此更新控件时,数据绑定不再有效。按钮现在不再能够基于Isbuttonenable值进行Enble / Disable。对此可能是什么解决方案。我想将ViewModel保留在我的用户控件中。

我尝试了很多方法并且很好地解决了这个问题。但

1 个答案:

答案 0 :(得分:0)

当您从其自己的代码中设置UserControl的DataContext时,该代码也会影响该控件的任何用法中的绑定。最初,您的<l:UserControl1>用法有一个继承的DataContext,可能有一个Isbuttonenable属性,您可以看到它的工作。为DataContext设置特定值时,它相当于将XAML更改为以下内容:

<StackPanel>
    <l:UserControl1 DataContext="{StaticResource MyUserControl1ViewModelInstance}">
        <StackPanel >
            <Button Click="Button_Click" Content="Click"/>
            <Button Content="My Control's Content" IsEnabled="{Binding Isbuttonenable}"/>
        </StackPanel>
    </l:UserControl1>

</StackPanel>

以这种方式看待它很明显,绑定现在将在Isbuttonenable对象上寻找UserControl1ViewModel属性。

如果您想为UserControl使用内部VM,最好不要在DependencyProperty上将其设置为新的自定义UserControl1,并更改那些用于使用ElementName的绑定{ {1}}或RelativeSource绑定专门访问该属性而不是隐式DataContext

我还建议您在此重新考虑整体设置。 UserControl的主要优点是您可以在UserControl.xaml文件中设置一组特定的内容,并在代码隐藏中操作它或者只是按原样重复使用它。如果您要像这样在外部设置Content,只需使用基本ContentControl实例并设置模板进行自定义。