Я написал CustomControl для WPF, который является просто ContentControl с ContentPresenter и Button.Проблема с привязкой на CustomControl
Вот шаблон управления (расположенный в Themes/Generic.xaml):
<ControlTemplate TargetType="{x:Type local:TestControl}">
<StackPanel Background="{TemplateBinding Background}">
<ContentPresenter Content="{TemplateBinding Content}" />
<Button Content="Next" IsEnabled="{TemplateBinding IsNextButtonEnabled}" />
</StackPanel>
</ControlTemplate>
Вот код управления (TestControl.cs):
public class TestControl : ContentControl
{
/// <summary>
/// Identifies the IsNextButtonEnabled dependency property
/// </summary>
public readonly static DependencyProperty IsNextButtonEnabledProperty = DependencyProperty.Register(
"IsNextButtonEnabled", typeof(bool), typeof(TestControl),
new PropertyMetadata(true)
);
static TestControl()
{
DefaultStyleKeyProperty.OverrideMetadata(typeof(TestControl), new FrameworkPropertyMetadata(typeof(TestControl)));
}
/// <summary>
/// Gets or sets the value indicating if the Next button of the control is enabled
/// </summary>
[BindableAttribute(true)]
public bool IsNextButtonEnabled
{
get
{
return (bool)GetValue(IsNextButtonEnabledProperty);
}
set
{
SetValue(IsNextButtonEnabledProperty, value);
}
}
}
Я хочу свяжите значение IsNextButtonEnabled из TestControl с другим элементом управления (например, CheckBox), который находится внутри содержимого самого TestControl.
Так что я сделал это, и он работает (когда я проверить или снимите флажок, кнопка включает или отключает себя корректно):
MainWindow.xaml
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
Title="MainWindow" Height="350" Width="525">
<Grid>
<local:TestControl IsNextButtonEnabled="{Binding ElementName=cb, Path=IsChecked}">
<CheckBox Name="cb" IsChecked="True" />
</local:TestControl>
</Grid>
</Window>
Но то, что я хочу сделать, это объявить мой TestControl в отдельном файле xaml. Так что я сделал это, но он не работает:
MainWindow.xaml
<Window x:Class="WpfApplication2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<local:MyTestControl />
</StackPanel>
</Window>
MyTestControl.xaml (MyTestControl.cs не изменяется):
<local:TestControl x:Class="WpfApplication2.MyTestControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication2"
IsNextButtonEnabled="{Binding ElementName=cb, Path=IsChecked}">
<Grid>
<CheckBox Name="cb" IsChecked="True" />
</Grid>
</local:TestControl>
При выполнении, в выходной window Я получаю это сообщение об ошибке:
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'ElementName=cb'. BindingExpression:Path=IsChecked; DataItem=null; target element is 'MyTestControl' (Name=''); target property is 'IsNextButtonEnabled' (type 'Boolean')
Я не понимаю мою ошибку. Я сделал что-то не так?
Заранее спасибо.
Вы пытались изменить свой Xaml так, что Checkbox имеет связывание? Значение, удалите IsNextButtonEnabled = из вашего объявления TestControl и добавьте в CheckBox, IsChecked = "{Binding IsNextButtonEnabled, Mode = TwoWay}". Затем убедитесь, что DataContext для CheckBox установлен в TestControl. –