Wpf 基于匹配对象在XAML中设置ComboBox.SelectedItem
我制作了一个模板,它基本上就是一个简单的调色板。它由Wpf 基于匹配对象在XAML中设置ComboBox.SelectedItem,wpf,data-binding,combobox,selecteditem,Wpf,Data Binding,Combobox,Selecteditem,我制作了一个模板,它基本上就是一个简单的调色板。它由SolidColorBrush对象列表填充 我还有一些保存当前颜色十六进制值的数据和一个将十六进制转换为solidcolorbush的转换器 我尝试的是根据数据源中的颜色设置组合框的SelectedItem属性。由于我的组合框中填充了类型为solidcolorbush的对象,并且我的绑定转换器返回了一个solidcolorbush,因此我假设它可以简单地说: SelectedItem="{Binding Color, Converter={St
SolidColorBrush
对象列表填充
我还有一些保存当前颜色十六进制值的数据和一个将十六进制转换为solidcolorbush
的转换器
我尝试的是根据数据源中的颜色设置组合框的SelectedItem
属性。由于我的组合框中填充了类型为solidcolorbush
的对象,并且我的绑定转换器返回了一个solidcolorbush
,因此我假设它可以简单地说:
SelectedItem="{Binding Color, Converter={StaticResource StringToBrush}}"
然而。。。它不起作用:(
我已经测试了绑定是否在幕后工作,方法是对组合框的Background属性使用完全相同的值
所以,很明显,我不能说SelectedItem=[something],其中[something]基本上是一个与我想要被选择的项目相等的对象
这样做的正确方法是什么?当然,在仅使用XAML的样式中使用绑定是可能的,而且我不必做一些讨厌的C#迭代组合框中的所有项以试图找到匹配项(这似乎非常老派)…?如果您使用的是MVVM模式,则向视图模型添加属性SelectedHexColor
,让视图模型在填充颜色笔刷组合框的列表中搜索正确的纯色笔刷,并更新com的选定项所指向的视图模型的SelectedBrush
属性bobox已绑定
[编辑]我刚刚读到,你想避免使用C#代码,因为你认为它是老派的。但这是MVVM模式的一个优势,因为你可以对这段已经是复杂业务逻辑的代码进行单元测试。将其放入XAML是非常不安全的,因为你无法对其进行单元测试,因此你无法获得正确的功能(除了自动化ui测试,它的实现要比单元测试复杂得多)
致以最诚挚的问候,
Oliver Hanappi如果您正在使用MVVM模式,则向视图模型添加一个属性SelectedHexColor
,让视图模型在填充颜色笔刷组合框的列表中搜索正确的纯色笔刷,并更新所选项目所在视图模型的SelectedBrush
属性组合框的属性已绑定
[编辑]我刚刚读到,你想避免使用C#代码,因为你认为它是老派的。但这是MVVM模式的一个优势,因为你可以对这段已经是复杂业务逻辑的代码进行单元测试。将其放入XAML是非常不安全的,因为你无法对其进行单元测试,因此你无法获得正确的功能(除了自动化ui测试,它的实现要比单元测试复杂得多)
致以最诚挚的问候,
Oliver Hanappi您可以在组合框上对SelectedItem进行数据绑定。如果我理解您的描述,您有一个十六进制字符串集合和一个名为Color的SolidColorBrush属性。下面的代码在更改所选项时更新Color属性
XAML:
代码隐藏:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media;
namespace SelItemTest
{
public partial class Window1 : Window, INotifyPropertyChanged
{
public Window1()
{
InitializeComponent();
Colors = new List<string>();
Colors.Add(Brushes.Red.ToString());
Colors.Add(Brushes.Blue.ToString());
Colors.Add(Brushes.Yellow.ToString());
Color = Brushes.Yellow;
DataContext = this;
}
public List<string> Colors { get; set;}
private SolidColorBrush _color;
public SolidColorBrush Color
{
get { return _color; }
set
{
_color = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Color"));
}
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
public class StringToBrushConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Color color = (Color)ColorConverter.ConvertFromString(value.ToString());
SolidColorBrush scb = new SolidColorBrush(color);
return scb;
}
#endregion
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用System.Windows;
使用System.Windows.Data;
使用System.Windows.Media;
名称空间selitestest
{
公共部分类Window1:Window,INotifyPropertyChanged
{
公共窗口1()
{
初始化组件();
颜色=新列表();
Colors.Add(画笔.Red.ToString());
添加(笔刷.Blue.ToString());
添加(笔刷.Yellow.ToString());
颜色=画笔。黄色;
DataContext=this;
}
公共列表颜色{get;set;}
私人SolidColorBrush_颜色;
公共色刷颜色
{
获取{return\u color;}
设置
{
_颜色=值;
if(PropertyChanged!=null)
{
PropertyChanged(此为新PropertyChangedEventArgs(“颜色”);
}
}
}
#区域INotifyProperty更改成员
公共事件属性更改事件处理程序属性更改;
#端区
}
公共类StringToBrushConverter:IValueConverter
{
#区域转换器成员
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
返回值.ToString();
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性)
{
Color Color=(Color)ColorConverter.ConvertFromString(value.ToString());
SolidColorBrush scb=新的SolidColorBrush(颜色);
返回scb;
}
#端区
}
}
您可以在组合框上数据绑定SelectedItem。如果我理解您的描述,您有一个十六进制字符串集合和一个名为Color的SolidColorBrush属性。下面的代码在更改选定项时更新Color属性
XAML:
代码隐藏:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Windows;
using System.Windows.Data;
using System.Windows.Media;
namespace SelItemTest
{
public partial class Window1 : Window, INotifyPropertyChanged
{
public Window1()
{
InitializeComponent();
Colors = new List<string>();
Colors.Add(Brushes.Red.ToString());
Colors.Add(Brushes.Blue.ToString());
Colors.Add(Brushes.Yellow.ToString());
Color = Brushes.Yellow;
DataContext = this;
}
public List<string> Colors { get; set;}
private SolidColorBrush _color;
public SolidColorBrush Color
{
get { return _color; }
set
{
_color = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Color"));
}
}
}
#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler PropertyChanged;
#endregion
}
public class StringToBrushConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.ToString();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
Color color = (Color)ColorConverter.ConvertFromString(value.ToString());
SolidColorBrush scb = new SolidColorBrush(color);
return scb;
}
#endregion
}
}
使用系统;
使用System.Collections.Generic;
使用系统组件模型;
使用System.Windows;
使用System.Windows.Data;
使用System.Windows.Media;
名称空间selitestest
{
公共部分类Window1:Window,INotifyPropertyChanged
{
公共窗口1()
{
初始化组件();
颜色=新列表();
颜色。添加(画笔。红色。ToStri)