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