2017-05-29 21 views
-1

@Updateを設定していない結合時に結合内の適切なUpdateSourceTriggerの作成に失敗しました。このようなバインディングを指定すると、{Binding MyProperty, UpdateSourceTrigger=PropertyChanged}ソースが更新されます。しかし、私はUpdateSourceTriggerのソースを更新しません。たDependencyPropertyはUpdateSourceTriggerに明示的に

DependencyPropertyは、次のように作成されます:あなたは以下を参照することができたよう

public static readonly DependencyProperty RatingValueProperty = DependencyProperty.Register(
    "RatingValue", typeof(int?), typeof(RatingControl), new FrameworkPropertyMetadata(default(int), 
     FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, 
     DependencyPropertyChangedCallback, 
     CoerceRatingValueCallback, 
     false, 
     UpdateSourceTrigger.PropertyChanged 
)); 

ない場合は、BindingUpdateSourceTriggerが省略されたときDefaultフラグを使用して作成し、PropertyChangedフラグとされます。

"動作しない"(ライン26の両方の例でを参照してください)結合:

0 _binding {System.Windows.Data.Binding} System.Windows.Data.BindingBase {System.Windows.Data.Binding} 
1 AsyncState null object 
2 BindingGroupName "" string 
3 BindsDirectlyToSource false bool 
4 Converter null System.Windows.Data.IValueConverter 
5 ConverterCulture null System.Globalization.CultureInfo 
6 ConverterCultureInternal null System.Globalization.CultureInfo 
7 ConverterParameter null object 
8 Delay 0 int 
9 ElementName null string 
10 FallbackValue {{DependencyProperty.UnsetValue}} object {MS.Internal.NamedObject} 
11 Flags Default System.Windows.Data.BindingBase.BindingFlags 
12 IsAsync false bool 
13 Mode Default System.Windows.Data.BindingMode 
14 NotifyOnSourceUpdated false bool 
15 NotifyOnTargetUpdated false bool 
16 NotifyOnValidationError false bool 
17 Path {System.Windows.PropertyPath} System.Windows.PropertyPath 
18 RelativeSource null System.Windows.Data.RelativeSource 
19 Source null object 
20 SourceReference null MS.Internal.Data.ObjectRef 
21 StringFormat null string 
22 TargetNullValue {{DependencyProperty.UnsetValue}} object {MS.Internal.NamedObject} 
23 TransfersDefaultValue true bool 
24 TreeContextIsRequired false bool 
25 UpdateSourceExceptionFilter null System.Windows.Data.UpdateSourceExceptionFilterCallback 
26 UpdateSourceTrigger Default System.Windows.Data.UpdateSourceTrigger 
27 ValidatesOnDataErrors false bool 
28 ValidatesOnExceptions false bool 
29 ValidatesOnNotifyDataErrors true bool 
30 ValidatesOnNotifyDataErrorsInternal true bool 
31 ValidationRules Count = 0 System.Collections.ObjectModel.Collection<System.Windows.Controls.ValidationRule> {MS.Internal.Controls.ValidationRuleCollection} 
32 ValidationRulesInternal Count = 0 System.Collections.ObjectModel.Collection<System.Windows.Controls.ValidationRule> {MS.Internal.Controls.ValidationRuleCollection} 
33 XPath null string 
34 _attachedPropertiesInPath 0 int 
35 _bindsDirectlyToSource false bool 
36 _doesNotTransferDefaultValue false bool 
37 _flags Default System.Windows.Data.BindingBase.BindingFlags 
38 _isAsync false bool 
39 _isSealed true bool 
40 _ppath {System.Windows.PropertyPath} System.Windows.PropertyPath 
41 _source {MS.Internal.Data.ExplicitObjectRef} MS.Internal.Data.ObjectRef {MS.Internal.Data.ExplicitObjectRef} 
42 _sourceInUse None System.Windows.Data.Binding.SourceProperties 
43 _values {MS.Internal.UncommonValueTable} MS.Internal.UncommonValueTable 
44 Static members  

"作業" バインディング:

これを解決する方法
0 _binding {System.Windows.Data.Binding} System.Windows.Data.BindingBase {System.Windows.Data.Binding} 
1 AsyncState null object 
2 BindingGroupName "" string 
3 BindsDirectlyToSource false bool 
4 Converter null System.Windows.Data.IValueConverter 
5 ConverterCulture null System.Globalization.CultureInfo 
6 ConverterCultureInternal null System.Globalization.CultureInfo 
7 ConverterParameter null object 
8 Delay 0 int 
9 ElementName null string 
10 FallbackValue {{DependencyProperty.UnsetValue}} object {MS.Internal.NamedObject} 
11 Flags PropDefault | ValidatesOnNotifyDataErrors System.Windows.Data.BindingBase.BindingFlags 
12 IsAsync false bool 
13 Mode Default System.Windows.Data.BindingMode 
14 NotifyOnSourceUpdated false bool 
15 NotifyOnTargetUpdated false bool 
16 NotifyOnValidationError false bool 
17 Path {System.Windows.PropertyPath} System.Windows.PropertyPath 
18 RelativeSource null System.Windows.Data.RelativeSource 
19 Source null object 
20 SourceReference null MS.Internal.Data.ObjectRef 
21 StringFormat null string 
22 TargetNullValue {{DependencyProperty.UnsetValue}} object {MS.Internal.NamedObject} 
23 TransfersDefaultValue true bool 
24 TreeContextIsRequired false bool 
25 UpdateSourceExceptionFilter null System.Windows.Data.UpdateSourceExceptionFilterCallback 
26 UpdateSourceTrigger PropertyChanged System.Windows.Data.UpdateSourceTrigger 
27 ValidatesOnDataErrors false bool 
28 ValidatesOnExceptions false bool 
29 ValidatesOnNotifyDataErrors true bool 
30 ValidatesOnNotifyDataErrorsInternal true bool 
31 ValidationRules Count = 0 System.Collections.ObjectModel.Collection<System.Windows.Controls.ValidationRule> {MS.Internal.Controls.ValidationRuleCollection} 
32 ValidationRulesInternal Count = 0 System.Collections.ObjectModel.Collection<System.Windows.Controls.ValidationRule> {MS.Internal.Controls.ValidationRuleCollection} 
33 XPath null string 
34 _attachedPropertiesInPath 0 int 
35 _bindsDirectlyToSource false bool 
36 _doesNotTransferDefaultValue false bool 
37 _flags PropDefault | ValidatesOnNotifyDataErrors System.Windows.Data.BindingBase.BindingFlags 
38 _isAsync false bool 
39 _isSealed true bool 
40 _ppath {System.Windows.PropertyPath} System.Windows.PropertyPath 
41 _source {MS.Internal.Data.ExplicitObjectRef} MS.Internal.Data.ObjectRef {MS.Internal.Data.ExplicitObjectRef} 
42 _sourceInUse None System.Windows.Data.Binding.SourceProperties 
43 _values {MS.Internal.UncommonValueTable} MS.Internal.UncommonValueTable 
44 Static members  

を私はする必要はありませんWPFで明示的に "UpdateSourceTrigger = PropertyChanged"を設定します。

@Update 2017年6月3日

私はこの問題を説明するためにサンプルプロジェクトへのリンク(click)に取り付けられています。 MainWindow.xamlを開いて、#35〜39行目を入力してください。ライン#36は動作しない動作を示し、ライン#39は動作動作を示す。

ライン#36

<local:RatingControl StarsCount="5" RatingValue="{Binding Rating, PresentationTraceSources.TraceLevel=High}" IsReadonly="False" HorizontalContentAlignment="Center" /> 

ライン#39

<local:RatingControl StarsCount="5" RatingValue="{Binding Rating, UpdateSourceTrigger=PropertyChanged, PresentationTraceSources.TraceLevel=High}" IsReadonly="False" HorizontalContentAlignment="Center" /> 

@Edit - 要求されたXAMLコード

<UserControl x:Class="so_44248130.RatingControl" 
      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="24" d:DesignWidth="240"> 
    <UserControl.Resources> 
     <BooleanToVisibilityConverter x:Key="BooleanToVisibilityConverter" /> 
     <BitmapImage x:Key="StarEmpty" UriSource="pack://application:,,,/so_44248130;component/star_black_empty.png" CacheOption="OnLoad" CreateOptions="IgnoreImageCache" /> 
     <BitmapImage x:Key="StarFull" UriSource="pack://application:,,,/so_44248130;component/star_black_full.png" /> 
    </UserControl.Resources> 
    <Grid> 
     <ItemsControl ItemsSource="{Binding StarsList, RelativeSource={RelativeSource FindAncestor, AncestorType=UserControl}}"> 
      <ItemsControl.ItemsPanel> 
       <ItemsPanelTemplate> 
        <StackPanel Orientation="Horizontal" /> 
       </ItemsPanelTemplate> 
      </ItemsControl.ItemsPanel> 
      <ItemsControl.ItemTemplate> 
       <DataTemplate> 
        <Grid> 
         <Button Grid.Row="0" Grid.Column="0" Width="24" Height="24" MaxHeight="24" Style="{StaticResource {x:Static ToolBar.ButtonStyleKey}}" Tag="{Binding}" Padding="0" HorizontalContentAlignment="Center" Click="ButtonBase_OnClick"> 
          <Grid> 
           <Grid.RowDefinitions> 
            <RowDefinition /> 
           </Grid.RowDefinitions> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width="24" /> 
           </Grid.ColumnDefinitions> 

           <Rectangle Grid.Row="0" Grid.Column="0" Width="{Binding EmptyStarWidth}" Height="24" HorizontalAlignment="Left"> 
            <Rectangle.Fill> 
             <ImageBrush ImageSource="{StaticResource StarEmpty}" 
             TileMode="Tile" 
             Stretch="Uniform" 
             AlignmentY="Top" 
             Viewport="0,0,24,3000" 
             ViewportUnits="Absolute" /> 
            </Rectangle.Fill> 
           </Rectangle> 
           <Rectangle Grid.Row="0" Grid.Column="0" Width="{Binding FullStarWidth}" Height="24" HorizontalAlignment="Left"> 
            <Rectangle.Fill> 
             <ImageBrush ImageSource="{StaticResource StarFull}" 
             TileMode="Tile" 
             Stretch="Uniform" 
             AlignmentY="Top" 
             Viewport="0,0,24,3000" 
             ViewportUnits="Absolute" /> 
            </Rectangle.Fill> 
           </Rectangle> 
          </Grid> 
         </Button> 
         <Rectangle Grid.Row="0" Grid.Column="0" Height="24" Width="24" Visibility="{Binding IsReadonly, Converter={StaticResource BooleanToVisibilityConverter}}" Fill="#02FFFFFF" /> 
        </Grid> 
       </DataTemplate> 
      </ItemsControl.ItemTemplate> 
     </ItemsControl> 
    </Grid> 
</UserControl> 
+1

FrameworkPropertyMetadataクラスの 'DefaultUpdateSourceTrigger'プロパティの値は、とにかく' PropertyChanged'です。したがって、より少ないパラメータでFrameworkPropertyMetadataコンストラクタを使用できます。つまり、私が作成した 'BindsTwoWayByDefault'のすべての依存プロパティは、問題なく 'PropertyChanged'でソースを更新するので、なぜあなたのものがそうでないのかは不明です。 – Clemens

+0

@Clemens私は自分の質問を編集しました(サンプルプロジェクトへのリンクを追加しました)。自分で参照してください – user2475983

+0

RatingControlのXAMLを見ることはできますか? –

答えて

0

私はそれを考え出した...部分的に...質問にリンクされている例プロジェクトで

は1、ライン#206-#228(click)、RatingControl.xaml.csファイルに移動する必要があります。これはButtonBase_OnClickメソッドです。ちょうどif (star.Value ==〜の部分の下に私は束縛の力UpdateSourceを追加しました。以下のコードを参照してください。 BindingSourceの更新を強制し、問題を解決する

if (star.Value == RatingValue) 
{ 
    RatingValue = 0; 
} 
else 
{ 
    RatingValue = star.Value; 
} 

BindingExpression binding = GetBindingExpression(RatingValueProperty); 
if (binding != null) 
{ 
    binding.UpdateSource(); 
} 

は(それはおそらく、回避策のいくつかの種類です..しかし、多分それは本当の有効な回答を投稿する右方向に誰かを入れます)。

注:デバッグ中

私が受け取ったBindingExpressionを視察してきましたし、IsUpdateOnPropertyChangedという名前のプロパティが何らかの理由でfalseに設定されています。私はそれがtrueに設定されるべきだと信じていますが、私はWPF内部についての知識が不足しているので、答えとしてそれを投稿します。

-1

FrameworkPropertyMetadataを使用するための具体的な理由はありますか?

プロパティをバックアップするだけの場合は、PropertyMetadataを試してみてください。

詳細はhereを参照してください。

+0

具体的な理由はありません。 'FrameworkPropertyMetadata'を' PropertyMetadata'に変更しましたが、唯一の結果はXAMLの 'Binding'で' Mode = TwoWay'を明示的に指定しなければならないということです。本当に助けてくれませんでした:( – user2475983

+0

私は、それはソースを見つけることができないので、 ' ' – Anurag

+0

はい、それは別の回避策のように見えますが、なぜ' DataContext'がUCに継承されてもソースを見つけることができないのかどうかを詳しく説明できますか? – user2475983

関連する問題