C# 如何从组合框的选定项绑定到属性?

C# 如何从组合框的选定项绑定到属性?,c#,wpf,xaml,data-binding,combobox,C#,Wpf,Xaml,Data Binding,Combobox,我试图创建一个用户控件,以允许用户在应用程序中定义自己的自定义线性渐变 到目前为止,我有一个用户控件,它使用以下模型来定义渐变停止的集合: public class StopSelectorModel : INotifyPropertyChanged { #region Field Values private Task _PropertyT; private ObservableCollection<GradientStop> _Stops; pri

我试图创建一个用户控件,以允许用户在应用程序中定义自己的自定义线性渐变

到目前为止,我有一个用户控件,它使用以下模型来定义渐变停止的集合:

public class StopSelectorModel : INotifyPropertyChanged {
    #region Field Values
    private Task _PropertyT;
    private ObservableCollection<GradientStop> _Stops;
    private GradientStop _SelectedStop;
    public event PropertyChangedEventHandler PropertyChanged;
    #endregion

    #region Properties
    /// <summary>
    /// Get or Set Gradient Stop Collection.
    /// </summary>
    public ObservableCollection<GradientStop> Stops {
        get { return this._Stops; }
        set {
            this._Stops = value;
            this._SelectedStop = value.FirstOrDefault( );

            this._PropertyT = Task.WhenAll( new Task[ ] {
                this.OnPropertyChanged( "Stops" ),
                this.OnPropertyChanged( "SelectedStop" )
            } );
        }
    }

    /// <summary>
    /// Get or Set Selected Gradient Stop.
    /// </summary>
    public GradientStop SelectedStop {
        get { return this._SelectedStop; }
        set {
            if ( value == null )
                return;

            if ( !this._Stops.Contains( value ) )
                this._Stops.Add( value );
            this._SelectedStop = value;

            this._PropertyT = this.OnPropertyChanged( "SelectedStop" );
        }
    }
    #endregion

    #region Methods
    protected async Task OnPropertyChanged( string P ) {
        if ( this.PropertyChanged != null )
            await this.PropertyChanged.Async( this, new PropertyChangedEventArgs( P ) );
    }
    #endregion

    #region Constructors
    /// <summary>
    /// Declare instance of StopSelectorModel.
    /// </summary>
    /// <param name="Base">GradientStopCollection to wrap.</param>
    public StopSelectorModel( ObservableCollection<GradientStop> Base ) { this.Stops = Base; }

    /// <summary>
    /// Declare default instance of StopSelectorModel.
    /// </summary>
    public StopSelectorModel( ) : this( new ObservableCollection<GradientStop>( new GradientStop[ ] {
        new GradientStop( Colors.White, 0.0D ),
        new GradientStop( Colors.Black, 1.0D )
    } ) ) { }
    #endregion
}
公共类StopSelectorModel:INotifyPropertyChanged{
#区域字段值
私有任务_property;
私人可观测采集站;
私人梯度停止_选择停止;
公共事件属性更改事件处理程序属性更改;
#端区
#区域属性
/// 
///获取或设置渐变停止集合。
/// 
公众可观察到的收集站{
获取{返回此。_停止;}
设置{
这个。_停止=值;
这是._SelectedStop=value.FirstOrDefault();
此._PropertyT=Task.WhenAll(新任务[]){
此.OnPropertyChanged(“停止”),
此.OnPropertyChanged(“SelectedStop”)
} );
}
}
/// 
///获取或设置选定的渐变停止。
/// 
公共梯度停止选择停止{
获取{返回此。\u SelectedStop;}
设置{
如果(值==null)
返回;
如果(!this._停止.Contains(值))
此。_停止。添加(值);
这是。\ u选择的停止=值;
this._PropertyT=this.OnPropertyChanged(“SelectedStop”);
}
}
#端区
#区域方法
受保护的异步任务OnPropertyChanged(字符串P){
if(this.PropertyChanged!=null)
等待this.PropertyChanged.Async(这是新的propertychangedventargs(P));
}
#端区
#区域构造函数
/// 
///声明StopSelectorModel的实例。
/// 
///要包装的GradientStopCollection。
公共StopSelectorModel(ObservableCollection基){this.Stops=Base;}
/// 
///声明StopSelectorModel的默认实例。
/// 
公共StopSelectorModel():此(新的ObservableCollection(新的GradientStop[]{
新渐变停止(颜色:白色,0.0D),
新渐变停止(颜色:黑色,1.0D)
} ) ) { }
#端区
}
我将其用作组合框的数据上下文(据我所知,ItemSource=Stops,SelectedItem=SelectedStop,双向绑定,类似于此的标准操作过程)

我还有一个控件,它使用以下颜色模型来定义颜色(基本上有4个滑动条):

//
///用于允许System.Windows.Media.Color结构完整数据绑定的包装器。
/// 
公共类ColorModel:INotifyPropertyChanged{
私有任务_property;
私人色彩(u色),;
/// 
///获取或设置上下文颜色。
/// 
公共颜色{
获取{返回此。\u Color;}
设置{
这个._Color=值;
此._PropertyT=Task.WhenAll(新任务[]){
此.OnPropertyChanged(“颜色”),
此.OnPropertyChanged(“ScA”),
本条关于不动产变更(“ScR”),
本.OnProperty变更(“ScG”),
本协议项下的不动产变更(“ScB”),
} );
}
}
/// 
///获取或设置颜色ScA值。
/// 
公共双ScA{
获取{返回此。\u Color.ScA;}
设置{
这个._Color.ScA=(float)值;
此._PropertyT=Task.WhenAll(新任务[]){
此.OnPropertyChanged(“颜色”),
此.OnPropertyChanged(“ScA”),
} );
}
}
/// 
///获取或设置颜色ScR值。
/// 
公共双ScR{
获取{返回此。\u Color.ScR;}
设置{
这个._Color.ScR=(float)值;
此._PropertyT=Task.WhenAll(新任务[]){
此.OnPropertyChanged(“颜色”),
本条关于不动产变更(“ScR”),
} );
}
}
/// 
///获取或设置颜色ScG值。
/// 
公共双ScG{
获取{返回此。\u Color.ScG;}
设置{
这个._Color.ScG=(float)值;
此._PropertyT=Task.WhenAll(新任务[]){
此.OnPropertyChanged(“颜色”),
本.OnProperty变更(“ScG”),
} );
}
}
/// 
///获取或设置颜色ScB值。
/// 
公共双ScB{
获取{返回此。\u Color.ScB;}
设置{
这个._Color.ScB=(float)值;
此._PropertyT=Task.WhenAll(新任务[]){
此.OnPropertyChanged(“颜色”),
本协议项下的不动产变更(“ScB”),
} );
}
}
受保护的异步任务OnPropertyChanged(字符串P){
等待此消息。PropertyChanged?.Async(
这是一个新的属性changedeventargs(P)).DontBlock();
}
公共事件属性更改事件处理程序属性更改;
/// 
///使用默认白色定义ColorModel。
/// 
publicColorModel():这个(Colors.White){}
/// 
///使用提供的颜色定义ColorModel。
/// 
///要指定给ColorModel的颜色。
公共颜色模型(颜色C){this.Color=C;}
}
所以我们到了。。。如何将组合框的SelectedItem的Color属性与此ColorModel绑定在一起?(如有必要,将提供更多细节,但时间有点短)

提前感谢您的帮助

编辑1 为了更清楚一点,我想将SelectedValue(颜色)传递给一个控件,该控件将能够编辑该颜色


因此,操作顺序是让组合框选择一个渐变停止,然后(这是我需要帮助的地方)负责调整颜色值的控件。

如果我理解正确,您希望在选择项目时显示所选渐变颜色

我会创建自己的DataTempl
/// <summary>
/// Wrapper for allowing complete databinding of a System.Windows.Media.Color struct.
/// </summary>
public class ColorModel : INotifyPropertyChanged {
    private Task _PropertyT;
    private Color _Color;

    /// <summary>
    /// Get or Set Context Color.
    /// </summary>
    public Color Color {
        get { return this._Color; }
        set {
            this._Color = value;
            this._PropertyT = Task.WhenAll( new Task[ ] {
                this.OnPropertyChanged( "Color" ),
                this.OnPropertyChanged( "ScA" ),
                this.OnPropertyChanged( "ScR" ),
                this.OnPropertyChanged( "ScG" ),
                this.OnPropertyChanged( "ScB" ),
            } );
        }
    }

    /// <summary>
    /// Get or Set Color ScA value.
    /// </summary>
    public double ScA {
        get { return this._Color.ScA; }
        set {
            this._Color.ScA = ( float )value;
            this._PropertyT = Task.WhenAll( new Task[ ] {
                this.OnPropertyChanged( "Color" ),
                this.OnPropertyChanged( "ScA" ),
            } );
        }
    }

    /// <summary>
    /// Get or Set Color ScR value.
    /// </summary>
    public double ScR {
        get { return this._Color.ScR; }
        set {
            this._Color.ScR = ( float )value;
            this._PropertyT = Task.WhenAll( new Task[ ] {
                this.OnPropertyChanged( "Color" ),
                this.OnPropertyChanged( "ScR" ),
            } );
        }
    }

    /// <summary>
    /// Get or Set Color ScG value.
    /// </summary>
    public double ScG {
        get { return this._Color.ScG; }
        set {
            this._Color.ScG = ( float )value;
            this._PropertyT = Task.WhenAll( new Task[ ] {
                this.OnPropertyChanged( "Color" ),
                this.OnPropertyChanged( "ScG" ),
            } );
        }
    }

    /// <summary>
    /// Get or Set Color ScB value.
    /// </summary>
    public double ScB {
        get { return this._Color.ScB; }
        set {
            this._Color.ScB = ( float )value;
            this._PropertyT = Task.WhenAll( new Task[ ] {
                this.OnPropertyChanged( "Color" ),
                this.OnPropertyChanged( "ScB" ),
            } );
        }
    }

    protected async Task OnPropertyChanged( string P ) {
        await this.PropertyChanged?.Async(
            this, new PropertyChangedEventArgs( P ) ).DontBlock( );
    }
    public event PropertyChangedEventHandler PropertyChanged;

    /// <summary>
    /// Define ColorModel with default White Color.
    /// </summary>
    public ColorModel( ) : this( Colors.White ) { }

    /// <summary>
    /// Define ColorModel with provided color.
    /// </summary>
    /// <param name="C">Color to assign to ColorModel.</param>
    public ColorModel( Color C ) { this.Color = C; }
}