2016-09-05 8 views
0

私はカスタムのusercontrolを持っています。これはウィンドウ内のいくつかのブール変数を変更し、バインディングから値を取得する必要があります。しかし、初めて値を取得しようとすると、デフォルト値に等しい値が返されます。そして、私が行動するとき、それはうまくいく。 catelののviewmodelCatel WPF UserControlは依存関係プロパティから値を取得できません

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)); 
} 

}

背後

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 
    } 
} 

とコードとの

<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> 

私は私のcatelウィンドウに

<ctrls:ToggleButton IsTurnedOn="{Binding Path=IndividualSpeechTimerState, Mode=TwoWay, NotifyOnSourceUpdated=True, UpdateSourceTrigger=PropertyChanged}" /> 
をそのコントロールを挿入0

私は最初にUserControlからIsTurnedOnプロパティを取得しようとすると、デフォルト値に等しい。

+0

ヌルはブールの有効な値ではありません。おそらくこれはDependencyPropertyにいくつかの問題を引き起こしていますか? – ibebbs

+0

いいえ、私はチェクでした。バインディングはdpに値を設定しません。デフォルト値は常に –

答えて

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

[ViewToViewModel(MappingType = ViewToViewModelMappingType.TwoWayViewWins)]を定義しているので、ビューの最初のプロパティが常に書き込まれます。これにより、この値を外部的にバインドすることができます。

依存関係プロパティ定義に有効な値(例:trueまたはfalse)を設定してください。

+0

です。外部結合が必要です。 vmからのデフォルト値と等しい値 –

関連する問題