C# 如何在我的“CustomControl”标记中指定“Mode”和“UpdateSourceTrigger”?

C# 如何在我的“CustomControl”标记中指定“Mode”和“UpdateSourceTrigger”?,c#,xaml,data-binding,custom-controls,devexpress,C#,Xaml,Data Binding,Custom Controls,Devexpress,拥有一个由组合框和按钮组成的自定义控件 绑定工作得很好,但是集合似乎只发生在LostFocus上 这是我的CustomControl的标记: <Style TargetType="{x:Type cba:CustomComboBoxEditView}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:T

拥有一个由组合框和按钮组成的自定义控件

绑定工作得很好,但是集合似乎只发生在LostFocus上

这是我的CustomControl的标记:

<Style TargetType="{x:Type cba:CustomComboBoxEditView}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type cba:CustomComboBoxEditView}">
                <Grid>
                    <Grid.ColumnDefinitions>
                        <ColumnDefinition Width="*"/>
                        <ColumnDefinition Width="Auto"/>
                    </Grid.ColumnDefinitions>

                    <dxe:ComboBoxEdit x:Name="ComboBoxEdit"
                                      Height="Auto" 
                                      Width="Auto"
                                      Grid.Column="0"
                                      ImmediatePopup="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ImmediatePopup}"
                                      AutoComplete="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=AutoComplete}"
                                      IsEnabled="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsEnabled}"
                                      Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Visibility}"
                                      VerticalAlignment="Stretch" 
                                      HorizontalAlignment="Stretch"
                                      ItemsSource="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ItemsSource}"
                                      DisplayMember="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=DisplayMember}"
                                      ValueMember="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=ValueMember}"
                                      EditValue="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=EditValue}"/>

                    <dxe:ButtonEdit ShowText="False"
                                    Grid.Column="1"
                                    AllowDefaultButton="False"
                                    IsEnabled="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsEnabled}"
                                    Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=Visibility}">
                        <dxe:ButtonInfo x:Name="PART_btnView" GlyphKind="Search" ToolTipService.ToolTip="View" />
                    </dxe:ButtonEdit>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>
如何在my CustomControl的标记中指定模式和UpdateSourceTrigger? 对于仅在LostFocus上发生的设置,我在CustomControl中做错了什么? 编辑:

CustomControl的代码隐藏:

找到了一个解决方案:

注册PopupClosed事件,然后设置属性


您试图在CustomControl失去焦点时进行更新,但CustomControl中ComboBox的绑定如何?@Markus我可能解释错了。它目前正在LostFocus上更新,但我不希望这样。我是否需要更改CustomControl中的绑定,使其正常更新?可能是我解释的不正确。我认为您的意图是像UpdateSourceTrigger=PropertyChanged一样立即更新它,但它不起作用。如果是这样,请查看CustomControl内部,并在此处另外设置UpdateSourceTrigger=PropertyChanged。但这只是一个想法,我不知道你能控制什么。也许你可以让我们看看。@Markus请查看更新。我在后面添加了代码。嗯。。。。我仍然不知道我是否是对的,所以很抱歉,如果这导致胡说八道。我将首先在CustomControls标记中尝试这一点:EditValue={Binding RelativeSource={RelativeSource TemplatedParent},Path=EditValue,UpdateSourceTrigger=PropertyChanged}下一次尝试是EditValueProperty=DependencyProperty.RegisterEditValue,typeofobject,TypeOfCustomComboxBoxedView,new FrameworkPropertyMetadatanull,FrameworkPropertyMetadataOptions.None、null、null、false、UpdateSourceTrigger.PropertyChanged;
<cba:CustomComboBoxEditView Name="someName"
                     ItemsSource="{Binding Path=SomeSource, Mode=OneWay, UpdateSourceTrigger=PropertyChanged}"
                     DisplayMember="DisplayMember"
                     ValueMember="ValueMember"
                     EditValue="{Binding Path=SomePath, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=False}"/>
public class CustomComboBoxEditView : Control
{
    #region Fields

    public static readonly DependencyProperty ImmediatePopupProperty;
    public static readonly DependencyProperty AutoCompleteProperty;
    public static readonly DependencyProperty ItemsSourceProperty;
    public static readonly DependencyProperty DisplayMemberProperty;
    public static readonly DependencyProperty ValueMemberProperty;
    public static readonly DependencyProperty EditValueProperty;

    public static readonly DependencyProperty SystemAppEntityViewCodeProperty;

    #endregion

    #region Constructor

    /// <summary>
    /// Default constructor.
    /// </summary>
    static CustomComboBoxEditView()
    {
        // Initialize as lookless control
        DefaultStyleKeyProperty.OverrideMetadata(typeof(CustomComboBoxEditView), new FrameworkPropertyMetadata(typeof(CustomComboBoxEditView)));

        // Initialize dependency properties
        ImmediatePopupProperty = DependencyProperty.Register("ImmediatePopup",
           typeof(bool), typeof(CustomComboBoxEditView), new UIPropertyMetadata(null));

        AutoCompleteProperty = DependencyProperty.Register("AutoComplete", typeof(bool),
           typeof(CustomComboBoxEditView), new UIPropertyMetadata(null));

        ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(object),
           typeof(CustomComboBoxEditView), new UIPropertyMetadata(null));

        DisplayMemberProperty = DependencyProperty.Register("DisplayMember", typeof(string),
           typeof(CustomComboBoxEditView), new UIPropertyMetadata(null));

        ValueMemberProperty = DependencyProperty.Register("ValueMember", typeof(string),
           typeof(CustomComboBoxEditView), new UIPropertyMetadata(null));

        EditValueProperty = DependencyProperty.Register("EditValue", typeof(object),
           typeof(CustomComboBoxEditView), new UIPropertyMetadata(null));

        SystemAppEntityViewCodeProperty = DependencyProperty.Register("SystemAppEntityViewCode", typeof(string),
           typeof(CustomComboBoxEditView), new UIPropertyMetadata(null));
    }

    #endregion

    #region Custom Control Properties

    public bool ImmediatePopup
    {
         get { return (bool)GetValue(ImmediatePopupProperty); }
         set { SetValue(ImmediatePopupProperty, value); }
    }

    public bool AutoComplete
    {
         get { return (bool)GetValue(AutoCompleteProperty); }
         set { SetValue(AutoCompleteProperty, value); }
    }

    public object ItemsSource
    {
        get { return (object)GetValue(ItemsSourceProperty); }
        set { SetValue(ItemsSourceProperty, value); }
    }

    public string DisplayMember
    {
        get { return (string)GetValue(DisplayMemberProperty); }
        set { SetValue(DisplayMemberProperty, value); }
    }

    public string ValueMember
    {
        get { return (string)GetValue(ValueMemberProperty); }
        set { SetValue(ValueMemberProperty, value); }
    }

    public object EditValue
    {
        get { return (object)GetValue(EditValueProperty); }
        set { SetValue(EditValueProperty, value); }
    }

    public string SystemAppEntityViewCode
    {
        get { return (string)GetValue(SystemAppEntityViewCodeProperty); }
        set { SetValue(SystemAppEntityViewCodeProperty, value); }
    }

    #endregion
}
public override void OnApplyTemplate()
    {
        base.OnApplyTemplate();

        var btnComboBoxEdit = Template.FindName("ComboBoxEdit", this) as ComboBoxEdit;
        btnComboBoxEdit.PopupClosed +=new ClosePopupEventHandler(btnComboBoxEdit_PopupClosed);
    }

private void btnComboBoxEdit_PopupClosed(object sender, ClosePopupEventArgs e)
    {
        EditValue = e.EditValue;
    }