2012-03-08 3 views
0

Я написал 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')

Я не понимаю мою ошибку. Я сделал что-то не так?

Заранее спасибо.

+0

Вы пытались изменить свой Xaml так, что Checkbox имеет связывание? Значение, удалите IsNextButtonEnabled = из вашего объявления TestControl и добавьте в CheckBox, IsChecked = "{Binding IsNextButtonEnabled, Mode = TwoWay}". Затем убедитесь, что DataContext для CheckBox установлен в TestControl. –

ответ

2

попробовать это, привязать IsChecked чекбокса к IsNextButtonEnabled собственности

<ContentControl x:Class="WpfStackOverflowSpielWiese.TestControl" 
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
       x:Name="control"> 

    <Grid> 
    <CheckBox Name="cb" 
       IsChecked="{Binding ElementName=control, Path=IsNextButtonEnabled}" /> 
    </Grid> 
</ContentControl> 

код за

public partial class TestControl : ContentControl 
{ 
    public TestControl() { 
    this.InitializeComponent(); 
    } 

    /// <summary> 
    /// Identifies the IsNextButtonEnabled dependency property 
    /// </summary> 
    public static readonly 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> 
    [Bindable(true)] 
    public bool IsNextButtonEnabled { 
    get { return (bool)this.GetValue(IsNextButtonEnabledProperty); } 
    set { this.SetValue(IsNextButtonEnabledProperty, value); } 
    } 
} 

надеюсь, что это помогает

+0

Он отлично работает благодаря :) – user1257470

+1

@ user1257470 ok, нет проблем, но тогда принимайте его .... – punker76

Смежные вопросы