WPF绑定到带有类的字典
本文关键字:字典 绑定 WPF | 更新日期: 2023-09-27 18:06:25
我是WPF编程新手,不是c#编程专业人员。
所以我有以下问题:我有很多不同的组合框和文本框。我想在后台将它们绑定到一个变量,因为我想用数据库中的数据填充组合框。
所以我在文件中创建了如下内容 liste.xaml.cs :
private Dictionary<string, Filter> _ctrlFilter;
public Dictionary<string, Filter> ctrlFilter {
get { return _ctrlFilter; }
set { _ctrlFilter = value; }
}
当我加载列表。xaml用下面的代码初始化ctrlFilter字典:
ctrlFilter = new Dictionary<string, Filter>
{
//ComboBox
{"hersteller", new Filter("Hersteller", typeof(ComboBox)) },
{"fahrzeugart", new Filter("Fahrzeugart", typeof(ComboBox), false) },
//TextBox
{"baujahr", new Filter("Baujahr", typeof(TextBox), true, typeof(short)) },
{"answerschaffungswert", new Filter("Anschaffungswert", typeof(TextBox), true, typeof(decimal)) },
{"finanz_restwert", new Filter("Restwert", typeof(TextBox), true, typeof(decimal)) },
//Others
{"zugelassen", new Filter("Zugelassen", typeof(DatePicker), true, typeof(DateTime)) },
{"vstabzug", new Filter("Vorsteuerabzug", typeof(CheckBox), true, typeof(bool)) },
};
所以过滤器类(也在list . example .cs中)看起来像这样:public class Filter
{
public string FilterName;
public Type ControlType;
public Type FromToType;
public bool Load;
public ObservableCollection<object> Items;
public object SelectedFilter;
public object From;
public object To;
public Filter( string name, Type type, bool load = true, Type ftType = null)
{
Reset();
FilterName = name;
ControlType = type;
Load = load;
FromToType = ftType;
}
public void Reset()
{
From = null;
To = null;
SelectedFilter = null;
Items = new ObservableCollection<object>();
}
}
现在我动态地将其他xml文件加载到列表中。xaml文件。例如Fahrzeug_Allgemein.xaml
这里是组合框,看起来像这样:
<StackPanel>
<Label Content="Hersteller:" Target="{Binding ElementName=cmb_hersteller, Mode=OneWay}"/>
<ComboBox x:Name="cmb_hersteller" Fahrzeuge:FilterExtension.FilterName="hersteller" Width="120" ItemsSource="{Binding ctrlFilter[hersteller].Items}" SelectedIndex="0" SelectionChanged="cmb_hersteller_SelectionChanged"/>
</StackPanel>
您可以看到,我试图从Filter类获取Items属性,但它不起作用。在Visual Studio 2015的输出中,它说:
System.Windows.Data Error: 40 : BindingExpression path error: 'Items' property not found on 'object' ''Filter' (HashCode=44888241)'. BindingExpression:Path=ctrlFilter[hersteller].Items; DataItem='liste' (Name=''); target element is 'ComboBox' (Name='cmb_hersteller'); target property is 'ItemsSource' (type 'IEnumerable')
我已经读了一些关于INotifyPropertyChanged
的东西,但我不知道如何在我的情况下使用它。
我没想到答案这么简单。我只需要将{ get; set; }
添加到Items属性中。
代码现在是这样的:
public class Filter
{
public string FilterName;
public Type ControlType;
public Type FromToType;
public bool Load;
public ObservableCollection<ComboBoxItem> Items { get; set; }
...
我认为这意味着,Items属性只能绑定这个添加项
我的声誉太低了,不能只评论这一点,但是如果你还没有读过c#中的属性和数据绑定,你应该读一下。我阅读了这些链接以及它们包含的额外链接,这有助于大大增加我的理解。