2015-11-20 3 views
2

Не удалось привязать данные в моем коде для моего пользовательского элемента управления. Очевидно, я должен использовать Generic.xaml для стилизации своего элемента управления, и я хочу привязать данные к своему элементу управления UserProfile.cs.Пользовательский контроль, привязка к коду за

Это код позади:

using System; 
using System.Windows; 
using System.Windows.Controls; 

namespace Controls 
{ 
    public class UserProfile : Control 
    { 
     static UserProfile() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(UserProfile), 
       new FrameworkPropertyMetadata(typeof(UserProfile))); 
     } 

     private Double _ProfilePhotoSize = 50; 
     private Double ProfilePhotoSize 
     { 
      get { return _ProfilePhotoSize; } 
      set 
      { 
       if (_ProfilePhotoSize != value) 
        _ProfilePhotoSize = value; 
      } 
     } 
    } 
} 

А вот XAML с переплетом, удалил последнюю часть, поскольку она не нужна:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Controls"> 

    <Style TargetType="{x:Type local:NumericUpDown}"> 
     <Style.Resources> 
      <SolidColorBrush x:Key="colour1" Color="#434953" /> 
      <SolidColorBrush x:Key="colour2" Color="#22252b" /> 
      <SolidColorBrush x:Key="colour3" Color="#606876" /> 
     </Style.Resources> 

     <Setter Property="Width" Value="85" /> 
     <Setter Property="Margin" Value="5" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:NumericUpDown}"> 
        <Border Focusable="{TemplateBinding Focusable}" 
          Width="{TemplateBinding Width}" 
          x:Name="Border"> 
         <Grid Focusable="False"> 
          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="auto"/> 
           <ColumnDefinition Width="1*"/> 
           <ColumnDefinition Width="auto"/> 
          </Grid.ColumnDefinitions> 

          <Button x:Name="PART_DecreaseButton" 
            Grid.Column="0"> 
           <Button.Content> 
            <Path Data="M0,0 L1,0 0.5,1Z" 
              Fill="White" 
              Width="8" 
              Height="6" 
              Stretch="Fill"/> 
           </Button.Content> 
           <Button.Template> 
            <ControlTemplate TargetType="Button"> 
             <Border Name="Border" 
               Background="{DynamicResource colour1}" 
               Width="25" 
               Height="25" 
               CornerRadius="5 0 0 5"> 
              <ContentPresenter /> 
             </Border> 
             <ControlTemplate.Triggers> 
              <Trigger Property="IsMouseOver" Value="True"> 
               <Setter TargetName="Border" Property="Background" Value="{DynamicResource colour3}" /> 
              </Trigger> 
             </ControlTemplate.Triggers> 
            </ControlTemplate> 
           </Button.Template> 
          </Button> 

          <TextBox x:Name="PART_TextBox" 
            Grid.Column="1" 
            Foreground="White" 
            Background="{DynamicResource colour2}" 
            VerticalContentAlignment="Center" 
            HorizontalContentAlignment="Center" 
            HorizontalAlignment="Stretch" 
            BorderThickness="0" 
            Focusable="False" Text="0" /> 

          <Button x:Name="PART_IncreaseButton" 
            Grid.Column="2"> 
           <Button.Content> 
            <Path Data="M0,1 L1,1 0.5,0Z" 
              Width="8" 
              Height="6" 
              Fill="White" 
              Stretch="Fill" /> 
           </Button.Content> 
           <Button.Template> 
            <ControlTemplate TargetType="Button"> 
             <Border Name="Border" 
               Background="{DynamicResource colour1}" 
               Width="25" 
               Height="25" 
               CornerRadius="0 5 5 0"> 
              <ContentPresenter /> 
             </Border> 
             <ControlTemplate.Triggers> 
              <Trigger Property="IsMouseOver" Value="True"> 
               <Setter TargetName="Border" Property="Background" Value="{DynamicResource colour3}" /> 
              </Trigger> 
             </ControlTemplate.Triggers> 
            </ControlTemplate> 
           </Button.Template> 
          </Button> 
         </Grid> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

    <Style TargetType="{x:Type local:UserProfile}"> 
     <Setter Property="DataContext" Value="{x:Type local:UserProfile}" /> 
     <Setter Property="Foreground" Value="White" /> 
     <Setter Property="FontSize" Value="16" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:UserProfile}"> 
        <Grid x:Name="circleGrid" Width="{Binding Path=ProfilePhotoSize, RelativeSource={RelativeSource AncestorType={x:Type local:UserProfile}}}"> 
... 

Это ошибка привязки я «получаю:

BindingExpression path error: 'ProfilePhotoSize' property not found on 'object' ''UserProfile' (Name='')'. BindingExpression:Path=ProfilePhotoSize; DataItem='UserProfile' (Name=''); target element is 'Grid' (Name='circleGrid'); target property is 'Width' (type 'Double')

Edit: Просто переместил некоторый код и получил проблему с кодом сейчас, я хочу, чтобы размер границы регулировался в зависимости от размера, который пользователь вводит в управление, поэтому я создал новый класс и свойство, которое получает ProfilePhotoSize, а затем разделит его числом.

Код За

using System; 
using System.ComponentModel; 
using System.Windows; 
using System.Windows.Controls; 

namespace Controls 
{ 
    public class UserProfile : Control 
    { 
     static UserProfile() 
     { 
      DefaultStyleKeyProperty.OverrideMetadata(typeof(UserProfile), 
       new FrameworkPropertyMetadata(typeof(UserProfile))); 
     } 
    } 
    public class UserProfileData : INotifyPropertyChanged 
    { 
     public event PropertyChangedEventHandler PropertyChanged; 
     protected virtual void OnPropertyChanged(string propertyName) 
     { 
      PropertyChangedEventHandler handler = PropertyChanged; 
      if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName)); 
     } 

     private Double _ProfilePhotoSize = 50; 
     public Double ProfilePhotoSize 
     { 
      get { return _ProfilePhotoSize; } 
      set 
      { 
       if (_ProfilePhotoSize != value) 
        _ProfilePhotoSize = value; 
       OnPropertyChanged("ProfilePhotoSize"); 
      } 
     } 
     private Double _ProfileBorderThickness = 3; 
     public Double ProfileBorderThickness 
     { 
      get { return _ProfileBorderThickness; } 
      set 
      { 
       double x = ProfilePhotoSize/3; 
       if (_ProfileBorderThickness != x) 
        _ProfileBorderThickness = x; 
       OnPropertyChanged("ProfileBorderThickness"); 
      } 
     } 
    } 
} 

Это XAML, привязка больше не работает: S

XAML

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:Controls"> 

    <Style TargetType="{x:Type local:UserProfile}"> 
     <Setter Property="DataContext" Value="{x:Type local:UserProfile}" /> 
     <Setter Property="Foreground" Value="White" /> 
     <Setter Property="FontSize" Value="16" /> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type local:UserProfile}"> 
        <Grid x:Name="circleGrid" Width="{Binding ProfilePhotoSize, RelativeSource={RelativeSource AncestorType={x:Type local:UserProfileData}}}"> 
         <Grid.RowDefinitions> 

ответ

2

изменить его к государственной собственности.

private Double _ProfilePhotoSize = 50; 
    public Double ProfilePhotoSize 
    { 
     get { return _ProfilePhotoSize; } 
     set 
     { 
      if (_ProfilePhotoSize != value) 
       _ProfilePhotoSize = value; 
     } 
    } 
+1

Какая глупая ошибка, которая была, я даже не подумал проверить это .. спасибо! –

+1

Хех, не беспокойтесь. Количество раз, когда я потерял полчаса до этого ...>. <Больше не происходит, хотя я использую фрагмент для своих свойств, может быть полезным: P https://msdn.microsoft.com/en- us/library/ms165394.aspx – pingu2k4

+0

Можете ли вы проверить мое редактирование? –

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