我正在创建用作其他控件容器的用户控件。我在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保留在我的用户控件中。
我尝试了很多方法并且很好地解决了这个问题。但
答案 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
实例并设置模板进行自定义。