2016-02-23 5 views
2

Это должно быть довольно простым и понятным, но привязка элемента не работает в XAML при использовании его из ресурса. Он отлично работает при использовании его непосредственно в XAML.WPF Element Binding не работает в XAML

Ресурсы:

<Window.Resources> 
    <StackPanel x:Key="panel"> 
     <CheckBox x:Name="chkDefaultValue" Content="Default Value" 
        IsChecked="{Binding ElementName=txtDefaultValue, Path=Text.Length, Mode=OneWay}" /> 
     <TextBox x:Name="txtDefaultValue" 
        Text="{Binding DefaultValue, Mode=TwoWay, ValidatesOnDataErrors=True}" 
        IsEnabled="{Binding ElementName=chkDefaultValue, Path=IsChecked}" /> 
    </StackPanel> 
</Window.Resources> 

XAML:

<StackPanel> 
    <!-- BINDING NOT WORKING --> 
    <ContentControl Content="{StaticResource panel}" /> 

    <!-- BINDING WORKING HERE --> 
    <CheckBox x:Name="chkDefaultValue" Content="Default Value" 
       IsChecked="{Binding ElementName=txtDefaultValue, Path=Text.Length, Mode=OneWay}" /> 
    <TextBox x:Name="txtDefaultValue" 
       Text="{Binding DefaultValue, Mode=TwoWay, ValidatesOnDataErrors=True}" 
       IsEnabled="{Binding ElementName=chkDefaultValue, Path=IsChecked}" /> 
</StackPanel> 

Как я мог это исправить?

ответ

2

Вы должны использовать DataTemplate

<Window.Resources> 
    <DataTemplate DataType="{x:Type ContentControl}" x:Key="panel"> 
     <StackPanel> 
      <CheckBox x:Name="chkDefaultValue" Content="Default Value" 
       IsChecked="{Binding ElementName=txtDefaultValue, Path=Text.Length, Mode=OneWay}" /> 
      <TextBox x:Name="txtDefaultValue" 
       Text="{Binding DefaultValue, Mode=TwoWay, ValidatesOnDataErrors=True}" 
       IsEnabled="{Binding ElementName=chkDefaultValue, Path=IsChecked}" /> 
     </StackPanel> 
    </DataTemplate> 
</Window.Resources> 

и

<ContentControl ContentTemplate="{StaticResource panel}" /> 

не проверял, но, вероятно, работает

1

И вы можете использовать ControlTemplate

<Window.Resources> 
    <ControlTemplate x:Key="panel"> 
     <StackPanel> 
      <CheckBox x:Name="chkDefaultValue" 
         Content="Default Value" 
         IsChecked="{Binding ElementName=txtDefaultValue, 
              Path=Text.Length, 
              Mode=OneWay}" /> 
      <TextBox x:Name="txtDefaultValue" 
        IsEnabled="{Binding ElementName=chkDefaultValue, 
             Path=IsChecked}" 
        Text="{Binding DefaultValue, 
            Mode=TwoWay, 
            ValidatesOnDataErrors=True}" /> 
     </StackPanel> 
    </ControlTemplate> 
</Window.Resources> 

и

<ContentControl Template="{StaticResource panel}" /> 
Смежные вопросы