繁体   English   中英

自定义依赖项属性不会更新源

Custom dependency property won't update the source

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在创建一个自定义控件,我想添加一个依赖属性,该属性的工作方式类似于CheckBox.IsChecked,即当用户单击控件时,绑定将更新源。 此自定义控件的声明如下:

public class QuadStateSelector : Control
{
    static QuadStateSelector()
    {
        PropertyChangedCallback callback = new PropertyChangedCallback(OnValueChanged);
        FrameworkPropertyMetadata md = new FrameworkPropertyMetadata(0, callback);
        md.BindsTwoWayByDefault = true;
        md.DefaultUpdateSourceTrigger = System.Windows.Data.UpdateSourceTrigger.PropertyChanged;
        ValueProperty = DependencyProperty.Register(nameof(Value), typeof(int), typeof(QuadStateSelector), md);

        DefaultStyleKeyProperty.OverrideMetadata(typeof(QuadStateSelector), new FrameworkPropertyMetadata(typeof(QuadStateSelector)));
    }

    private static void OnValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
    }

    public int Value
    {
        get { return (int)this.GetValue(ValueProperty); }
        set { this.SetValue(ValueProperty, value); }
    }

    public static readonly DependencyProperty ValueProperty;

如您所见,默认绑定是2种方式,在更改源时触发。 我还添加了一个回调,以便可以看到属性何时更改。

我的XAML是:

<rt:QuadStateSelector Name="qss" Value="{Binding LineState}" Canvas.Left="262" Canvas.Top="10" Background="Azure"/>
<xctk:IntegerUpDown Value="{Binding ElementName=qss, Path=Value }"/>

我的来源是:

public int LineState
{
    get => _LineState;
    set => _LineState = value;    // This line is never called
}

控件模板中的事件触发器正在更改依赖项属性的值,如下所示:

<Style TargetType="{x:Type local:QuadStateSelector}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type local:QuadStateSelector}">
                <StackPanel Orientation="Horizontal" Background="{Binding Background, RelativeSource={RelativeSource TemplatedParent}}">
                    <Ellipse Margin="1,0,1,0" Name="Button1" Width="14" Height="14" Stroke="{Binding Button1Brush, RelativeSource={RelativeSource TemplatedParent}}" StrokeThickness="2" Fill="AntiqueWhite"/>
                    <Ellipse Margin="1,0,1,0" Name="Button2" Width="14" Height="14" Stroke="{Binding Button2Brush, RelativeSource={RelativeSource TemplatedParent}}" StrokeThickness="2" Fill="AntiqueWhite"/>
                    <Ellipse Margin="1,0,1,0" Name="Button3" Width="14" Height="14" Stroke="{Binding Button3Brush, RelativeSource={RelativeSource TemplatedParent}}" StrokeThickness="2" Fill="AntiqueWhite"/>
                    <Ellipse Margin="1,0,1,0" Name="Button4" Width="14" Height="14" Stroke="{Binding Button4Brush, RelativeSource={RelativeSource TemplatedParent}}" StrokeThickness="2" Fill="AntiqueWhite"/>
                </StackPanel>
                <ControlTemplate.Triggers>
                    <Trigger Property="Value" Value="0">
                        <Setter TargetName="Button1" Property="Fill" Value="{Binding Button1Brush, RelativeSource={RelativeSource TemplatedParent}}"/>
                    </Trigger>
                    <Trigger Property="Value" Value="1">
                        <Setter TargetName="Button2" Property="Fill" Value="{Binding Button2Brush, RelativeSource={RelativeSource TemplatedParent}}"/>
                    </Trigger>
                    <Trigger Property="Value" Value="2">
                        <Setter TargetName="Button3" Property="Fill" Value="{Binding Button3Brush, RelativeSource={RelativeSource TemplatedParent}}"/>
                    </Trigger>
                    <Trigger Property="Value" Value="3">
                        <Setter TargetName="Button4" Property="Fill" Value="{Binding Button4Brush, RelativeSource={RelativeSource TemplatedParent}}"/>
                    </Trigger>
                    <EventTrigger RoutedEvent="Control.MouseDown" SourceName="Button1">
                        <BeginStoryboard>
                            <Storyboard>
                                <Int32AnimationUsingKeyFrames Storyboard.TargetProperty="Value" Duration="0:0:1">
                                    <DiscreteInt32KeyFrame KeyTime="0" Value="0"/>
                                </Int32AnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="Control.MouseDown" SourceName="Button2">
                        <BeginStoryboard>
                            <Storyboard>
                                <Int32AnimationUsingKeyFrames Storyboard.TargetProperty="Value" Duration="0:0:1">
                                    <DiscreteInt32KeyFrame KeyTime="0" Value="1"/>
                                </Int32AnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="Control.MouseDown" SourceName="Button3">
                        <BeginStoryboard>
                            <Storyboard>
                                <Int32AnimationUsingKeyFrames Storyboard.TargetProperty="Value" Duration="0:0:1">
                                    <DiscreteInt32KeyFrame KeyTime="0" Value="2"/>
                                </Int32AnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                    <EventTrigger RoutedEvent="Control.MouseDown" SourceName="Button4">
                        <BeginStoryboard>
                            <Storyboard>
                                <Int32AnimationUsingKeyFrames Storyboard.TargetProperty="Value" Duration="0:0:1">
                                    <DiscreteInt32KeyFrame KeyTime="0" Value="3"/>
                                </Int32AnimationUsingKeyFrames>
                            </Storyboard>
                        </BeginStoryboard>
                    </EventTrigger>
                </ControlTemplate.Triggers>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

有两个相互关联的控件,当我运行该应用程序时,一个控件中的更改会反映在另一个控件中,但是只有IntegerUpDown中所做的更改才会触发设置程序。 因此,事件触发器肯定是在修改依赖项属性,因为(a)调用了属性已更改的回调,并且(b)IntegerUpDown(绑定到依赖项属性)中的值已更新。

我在这里想念什么?

问题暂未有回复.您可以查看右边的相关问题.
2 依赖属性 - 更新源

我对自定义依赖属性疯狂。 我已在这里检查了大量的线程,但还没有找到任何解决方案。 我想要做的是,如果源提供特定值(对于给定示例为null),则替换Property的值。 无论我尝试什么,源中的属性值都保持为null并且永远不会更新。 这是我的自定义控件: 这是我绑定的Data ...

6 在设置自定义控件DataContext之前,不会更新绑定到父用户控件中的依赖项属性的自定义控件中的依赖项属性。

我创建了一个自定义文本框来包含验证。 在此控件中,有一个名为InputType的依赖项属性。 当在文本框中更改datacontext时,我捕获了绑定表达式并添加了规则。 当我直接在应用程序中使用此自定义控件时,这将正常工作。 设置依赖项属性,然后设置数据上下文。 设置属性后即可创建规则,这一切都 ...

7 样式DataTrigger不更新自定义控件依赖项属性

我定义了一个自定义控件,该控件允许我绘制一系列圆弧,从而形成一个分段的圆。 在此控件中,我定义了一个依赖项属性,该属性使我可以设置要绘制的段数,即 我想根据如下样式定义的数据触发器在xaml中设置此属性 但是,尝试将SegmentCount属性设置回0的“ False” Dat ...

9 自定义控件中的依赖项属性未更新

我试图做一个自定义控件,它基本上是一个位于Datagrid列标题上方的TextBox,并在datagrid列中显示总数。 控件库由两个自定义控件组成:DataGridColumnTotal包含文本框,该文本框还包含对DataGrid和ItemsSource的引用。 另一个称为DataGrid ...

10 自定义控件中的依赖项属性绑定和更新

我创建了遇到相同问题的代码的简化版本。 问题是,我不确定为什么自定义控件中的依赖项属性在模型中更改后没有更新。 模型: XAML: 背后的代码: 自定义控件: 正如您在自定义控件中看到的那样,我有一组项目,这些项目包含具有要绑定到的依赖项属性的对象。 因 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2021 STACKOOM.COM