2016-09-05 4 views
0

Ich habe benutzerdefinierte Benutzersteuerung, die einige boolesche Variable im Fenster ändern müssen und Wert von einigen Bindung erhalten. Aber wenn ich versuche, beim ersten Mal value es gleich dem Standardwert - null. Und wenn ich etwas mache, ist es gut.Catel WPF UserControl kann nicht Wert von Abhängigkeitseigenschaft

<catel:UserControl x:Class="App.Shell.Controls.ToggleButton" 
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:catel="http://catel.codeplex.com" 
        xmlns:debug="clr-namespace:System.Diagnostics;assembly=System"> 
    <!-- Content --> 
    <Grid> 
     <Grid.Resources> 
      <Style TargetType="{x:Type Button}"> 
       <Setter Property="Width" Value="37" /> 
       <Setter Property="Template"> 
        <Setter.Value> 
         <ControlTemplate TargetType="{x:Type Button}"> 
          <Label 
           Margin="0" 
           Padding="0" 
           HorizontalContentAlignment="Center" 
           VerticalContentAlignment="Center" 
           Background="#010000" 
           Foreground="#FEFEFF" 
           FontSize="12"> 
           <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" /> 
          </Label> 
         </ControlTemplate> 
        </Setter.Value> 
       </Setter> 
       <Style.Triggers> 
        <DataTrigger Binding="{Binding IsTurnedOn}" Value="True"> 
         <Setter Property="Content" Value="Turn off" /> 
        </DataTrigger> 
        <DataTrigger Binding="{Binding IsTurnedOn}" Value="False"> 
         <Setter Property="Content" Value="Turn on" /> 
        </DataTrigger> 
       </Style.Triggers> 
      </Style> 
     </Grid.Resources> 

     <Button> 
      <Button.InputBindings> 
       <MouseBinding Command="{Binding ToggleCmd}" MouseAction="LeftDoubleClick" /> 
      </Button.InputBindings> 
     </Button> 
    </Grid> 
</catel:UserControl> 

mit catel Viewmodel

namespace App.Shell.Controls 
{ 
    using Catel.Data; 
    using Catel.MVVM; 
    using System; 
    using System.Windows.Input; 

    /// <summary> 
    /// UserControl view model. 
    /// </summary> 
    public class ToggleButtonViewModel : ViewModelBase 
    { 
     /// <summary> 
     /// Initializes a new instance of the <see cref="ToggleButtonViewModel"/> class. 
     /// </summary> 
     public ToggleButtonViewModel() 
     { 
      ToggleCmd = new Command(OnToggleCmdExecute); 
     } 

     /// <summary> 
     /// Gets the title of the view model. 
     /// </summary> 
     /// <value>The title.</value> 
     public override string Title { get { return "ToggleButton"; } } 

     public Command ToggleCmd { get; private set; } 
     private void OnToggleCmdExecute() 
     { 
      IsTurnedOn = !IsTurnedOn; 
     } 

     public bool IsTurnedOn 
     { 
      get { return GetValue<bool>(IsTurnedOnProperty); } 
      set { SetValue(IsTurnedOnProperty, value); } 
     } 
     public static readonly PropertyData IsTurnedOnProperty = RegisterProperty("IsTurnedOn", typeof(bool), setParent: false, createDefaultValue: null); 
     // TODO: Register models with the vmpropmodel codesnippet 
     // TODO: Register view model properties with the vmprop or vmpropviewmodeltomodel codesnippets 
     // TODO: Register commands with the vmcommand or vmcommandwithcanexecute codesnippets 
    } 
} 

und Code hinter

namespace App.Shell.Controls 
{ 
using Catel.Windows.Controls; 
using System.Windows; 
using System.Windows.Input; 
using Catel.MVVM.Views; 
using System; 
using Catel.MVVM; 

/// <summary> 
/// Interaction logic for ToggleButton.xaml. 
/// </summary> 
public partial class ToggleButton : UserControl 
{ 
    /// <summary> 
    /// Initializes a new instance of the <see cref="ToggleButton"/> class. 
    /// </summary> 
    public ToggleButton() 
    { 
     InitializeComponent(); 
    } 

    [ViewToViewModel(MappingType = ViewToViewModelMappingType.TwoWayViewWins)] 
    public bool IsTurnedOn 
    { 
     get { return (bool)GetValue(IsTurnedOnProperty); } 
     set { SetValue(IsTurnedOnProperty, value); } 
    } 
    public static readonly DependencyProperty IsTurnedOnProperty = 
     DependencyProperty.Register("IsTurnedOn", typeof(bool), typeof(ToggleButton), new PropertyMetadata(null)); 
} 

}

i einsetzen, dass die Kontrolle meiner catel Fenster

<ctrls:ToggleButton IsTurnedOn="{Binding Path=IndividualSpeechTimerState, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" /> 

Wenn ich versuche, die Eigenschaft IsTurnedOn von UserControl zum ersten Mal zu bekommen, ist es gleich dem Standardwert.

+0

Null ist kein gültiger Wert für eine Bool. Vielleicht verursacht dies die DependencyProperty einige Probleme? – ibebbs

+0

Nein, ich war Chek. Bindung don 't setzen einen Wert zu dp verwenden Sie einfach Standardwert immer –

Antwort

0
[ViewToViewModel(MappingType = ViewToViewModelMappingType.ViewModelToView)] 
    public bool IsTurnedOn 
    { 
     get { return (bool)GetValue(IsTurnedOnProperty); } 
     set { SetValue(IsTurnedOnProperty, value); } 
    } 
    public static readonly DependencyProperty IsTurnedOnProperty = 
     DependencyProperty.Register("IsTurnedOn", typeof(bool), typeof(ToggleButton), new FrameworkPropertyMetadata(true, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnIsTurnedOnChanged)); 

    private static void OnIsTurnedOnChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     var btn = d as ToggleButton; 
     var vm = btn.ViewModel as ToggleButtonViewModel; 
     if(vm.IsTurnedOn != btn.IsTurnedOn) 
      vm.IsTurnedOn = btn.IsTurnedOn; 
    } 
0

Da Sie [ViewToViewModel(MappingType = ViewToViewModelMappingType.TwoWayViewWins)] definiert haben, wird immer die Eigenschaft "first time" der Ansicht geschrieben. Dadurch können Sie diesen Wert extern binden.

Stellen Sie sicher, dass ein gültiger Wert in der Abhängigkeitseigenschaftsdefinition festgelegt ist (z. B. wahr oder falsch).

+0

ja, ich brauche extern binden. aber der Wert ist gleich dem Standardwert von vm –

Verwandte Themen