2014-11-11 4 views
0

Привет Я пытаюсь связать свойство управления пользователем, но пока не удалось. Ниже мой код.wpf Как связать свойство usercontrol

<UserControl x:Class="MyControl" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     d:DesignHeight="120" d:DesignWidth="120" 
     x:Name="uc" 
     Background="Transparent"> 
    <Grid> 
     <Viewbox> 
      ...... 
      <CheckBox Name="Start" Visibility="Hidden" IsChecked="{Binding Path=Animation, ElementName=uc, Mode=TwoWay}"/> 
      ....... 
     </Viewbox> 
    </Grid> 
</UserControl> 

Код управления пользователя позади.

public partial class MyControl: UserControl 
    { 
    public static readonly DependencyProperty AnimationProperty = DependencyProperty.Register("Animation", typeof(bool), typeof(CircularProgressBar)); 
    public bool Animation 
    { 
     get { return (bool)GetValue(AnimationProperty); } 
     set 
     { 
     SetValue(AnimationProperty, value); 
     } 
    } 


    public MyControl() 
    { 
     InitializeComponent(); 
     //(this.Content as FrameworkElement).DataContext = this; 
    } 

    } 

Посмотреть код

<local:MyControl x:Name="cpb" Animation="{Binding CpbIsEnabled, Mode=TwoWay}" /> 

код Просмотр модели

private bool cpbEnabled; 
public bool CpbIsEnabled 
{ 
    get { return cpbEnabled; } 
    set { cpbEnabled = value; OnPropertyChanged("CpbIsEnabled"); } 
} 

public ICommand ShowSelFlagCommand 
{ 
    get 
    { 
    return showSelFlagCommand ?? (showSelFlagCommand = new DelegateCommand(() => 
    { 
     if (CpbIsEnabled) { CpbIsEnabled = false; } 
     else { CpbIsEnabled = true; } 
    } 
    )); 
    } 
} 

я ставлю точку останова в анимации набора свойств метода в коде управления пользователя позади. Но когда ICOmmand in view модель выполняется, она никогда не достигает точки останова. Другими словами, свойство Animation не устанавливается привязкой.

Может ли кто-нибудь сказать мне, что я пропустил?

Спасибо,

+0

метод набора анимации свойство не будет вызвана с помощью привязки. Это свойство используется только при получении или настройке в коде –

+0

Свойство Animation не установлено привязкой. Как я могу заставить его работать? – Shawn

+1

Я считаю, что вы используете стандартный синтаксис Property как оболочку для DependencyProperty. Геттер в порядке, но сеттер должен ТОЛЬКО вызвать SetValue (AnimationProperty, значение); – jhenninger

ответ

0

Вы должны реализовать DependencyProperty в элемента управления код-сзади.

После того как вы внедрили свойство зависимости для своего элемента управления, свойство будет показано в вашем XAML.

+0

Привет Скотт Я реализовал свойство зависимостей AnimationProperty. См. Второй блок кода. И свойство Animation было выставлено. Проблема заключалась в том, что привязка не работала. Есть идеи? – Shawn

+0

Вам не нужен SetValueDP. Просто используйте SetValue. Также удалите зависимую от INotifyPropertyChanged зависимость от вашего кода. Использование MVVM позволит решить многие из ваших проблем. –

+0

Я прокомментировал SetValueDP и удалил зависимость INotifyPropertyChanged в коде. но привязка все еще не работает? – Shawn

0

Наконец-то я понял это. Большое спасибо всем, кто помог.

управление кодом пользователя

<UserControl.Resources> 
    <BooleanToVisibilityConverter x:Key="bool2visibility" /> 
    </UserControl.Resources> 
    <Grid> 
    <Viewbox> 
     <Grid x:Name="LayoutRoot" Background="Transparent" HorizontalAlignment="Center" VerticalAlignment="Center" Visibility="{Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type UserControl}}, Path=IsLoading, Mode=OneWay, Converter={StaticResource bool2visibility}}"> 
     <Grid.RenderTransform> 
      <ScaleTransform x:Name="SpinnerScale" ScaleX="1.0" ScaleY="1.0" /> 
     </Grid.RenderTransform> 
     <Canvas RenderTransformOrigin="0.5,0.5" 
        HorizontalAlignment="Center" 
        VerticalAlignment="Center" 
        Width="120" Height="120" > 
      <Ellipse Width="21.835" Height="21.862" 
        Canvas.Left="20.1696" 
        Canvas.Top="9.76358" 
        Stretch="Fill" Fill="Orange" 
        Opacity="1.0"/> 
      <Ellipse Width="21.835" Height="21.862" 
        Canvas.Left="2.86816" 
        Canvas.Top="29.9581" Stretch="Fill" 
        Fill="Black" Opacity="0.9"/> 
      <Ellipse Width="21.835" Height="21.862" 
        Canvas.Left="5.03758e-006" 
        Canvas.Top="57.9341" Stretch="Fill" 
        Fill="Black" Opacity="0.8"/> 
      <Ellipse Width="21.835" Height="21.862" 
        Canvas.Left="12.1203" 
        Canvas.Top="83.3163" Stretch="Fill" 
        Fill="Black" Opacity="0.7"/> 
      <Ellipse Width="21.835" Height="21.862" 
        Canvas.Left="36.5459" 
        Canvas.Top="98.138" Stretch="Fill" 
        Fill="Black" Opacity="0.6"/> 
      <Ellipse Width="21.835" Height="21.862" 
        Canvas.Left="64.6723" 
        Canvas.Top="96.8411" Stretch="Fill" 
        Fill="Black" Opacity="0.5"/> 
      <Ellipse Width="21.835" Height="21.862" 
        Canvas.Left="87.6176" 
        Canvas.Top="81.2783" Stretch="Fill" 
        Fill="Black" Opacity="0.4"/> 
      <Ellipse Width="21.835" Height="21.862" 
        Canvas.Left="98.165" 
        Canvas.Top="54.414" Stretch="Fill" 
        Fill="Black" Opacity="0.3"/> 
      <Ellipse Width="21.835" Height="21.862" 
        Canvas.Left="92.9838" 
        Canvas.Top="26.9938" Stretch="Fill" 
        Fill="Black" Opacity="0.2"/> 
      <Ellipse Width="21.835" Height="21.862" 
        Canvas.Left="47.2783" 
        Canvas.Top="0.5" Stretch="Fill" 
        Fill="Black" Opacity="0.1"/> 
      <Canvas.RenderTransform> 
      <RotateTransform x:Name ="SpinnerRotate" Angle = "0" /> 
      </Canvas.RenderTransform> 
      <Canvas.Triggers> 
      <EventTrigger RoutedEvent ="ContentControl.Loaded" > 
       <BeginStoryboard> 
       <Storyboard x:Name="CirccularProgressBarStoryBoard"> 
        <DoubleAnimation 
        Storyboard.TargetName ="SpinnerRotate" 
        Storyboard.TargetProperty ="(RotateTransform.Angle)" 
        From="0" To="360" 
        Duration="0:0:01" 
        RepeatBehavior="Forever"/> 
       </Storyboard> 
       </BeginStoryboard> 
      </EventTrigger> 
      </Canvas.Triggers> 
     </Canvas> 
     </Grid> 
    </Viewbox> 
    </Grid> 

управление пользователем фоновый код.

public partial class CircularProgressBar : UserControl 
    { 
    public static readonly DependencyProperty IsLoadingProperty = DependencyProperty.Register("IsLoading", typeof(bool), typeof(CircularProgressBar), new UIPropertyMetadata(false)); 
    public bool IsLoading 
    { 
     get { return (bool)GetValue(IsLoadingProperty); } 
     set { SetValue(IsLoadingProperty, value); } 
    } 

    public CircularProgressBar() 
    { 
     InitializeComponent(); 
     (this.Content as FrameworkElement).DataContext = this; 
    } 
    } 

Посмотреть axml

<local:CircularProgressBar x:Name="cpb" IsLoading="{Binding CPBLoading}" > 
Смежные вопросы