Wpf 如何在UserControl中设置与Combox的绑定?
我在这个问题上花了好几天时间,似乎无法使它发挥作用 我有一个用户控件,它用以下代码保存到xaml文件中:Wpf 如何在UserControl中设置与Combox的绑定?,wpf,binding,Wpf,Binding,我在这个问题上花了好几天时间,似乎无法使它发挥作用 我有一个用户控件,它用以下代码保存到xaml文件中: StringBuilder outstr = new StringBuilder(); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.OmitXmlDeclaration = true;
StringBuilder outstr = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings();
settings.Indent = true;
settings.OmitXmlDeclaration = true;
XamlDesignerSerializationManager dsm = new
XamlDesignerSerializationManager(XmlWriter.Create(outstr, settings));
dsm.XamlWriterMode = XamlWriterMode.Expression;
System.Windows.Markup.XamlWriter.Save(test1, dsm);
String saveCard = outstr.ToString();
File.WriteAllText("inputEnum.xaml", saveCard);
用户控件的Xaml:
<Grid >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="{Binding DescriptionWidth}" />
<ColumnDefinition Width="{Binding ValueWidth}" />
</Grid.ColumnDefinitions>
<ComboBox Grid.Column="1" Background="White" FontSize="{Binding FontSizeValue}" Width="Auto"
Padding="10,0,5,0" ItemsSource="{Binding ComboItemsProperty}" SelectedIndex="{Binding EnumSelectedIndex}">
</ComboBox>
</Grid>
以下是我的属性和更改的方法:
EnumItemsCollection ComboItems = new EnumItemsCollection();
public EnumItemsCollection ComboItemsProperty
{
get { return ComboItems; }
set
{
ComboItems = value;
OnPropertyChanged("ComboItemsProperty");
}
}
public void OnPropertyChanged(string propertyName)
{
getEnumItems(this.ComboItemsProperty, this.EnumSelectedIndex, this.ID, this.SubmodeID);
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this.ComboItems, new PropertyChangedEventArgs(propertyName));
}
}
只是一张纸条。EnumItemsCollection是一个继承了ObservableCollection的简单类。这门课没有别的了。(不确定这是否有区别)
我认为这应该是可行的,但是当我通过XAMLReader加载XAML文件时,我的组合框项不会更新
编辑:
我在一个用户控件实例上运行了一个小测试,该实例不是从XAML加载的,而是在MainWindow.XAML中
一切正常。当我添加到ComboItemsProperty时,combobox会更新
因此,我去掉了{Binding ComboItemsProperty},并尝试在代码中设置绑定,如上所述,将“this”更改为用户控件的实例。没用。这告诉我是绑定代码没有正常工作
我相当肯定的是bind.Source行就是问题所在。当它在用户控件中时,我不确定该放什么
编辑:
从文件加载usercontrol的代码:
FileStream stream = File.Open("usercontrol.xaml", FileMode.Open, FileAccess.Read);
ComboBox cmb = System.Windows.Markup.XamlReader.Load(stream) as ComboBox;
它装载得非常好。绑定不起作用(ItemsSource={Binding ComboItemsProperty}),因为绑定没有保存
我从一个文件加载它,因为这个程序在某种意义上有很多用户界面。每个属性都将由使用该程序的不同人员加载。您需要设置包含属性的实例的上下文ComboItemsProperty。因此,您应该将其设置为
this.DataContext
或包含您定义的ItemSource属性的其他类对象实例,而不是“this”
试试这个
Binding bind = new Binding();
bind.Mode = BindingMode.TwoWay;
bind.Source = this.DataContext;
bind.Path = new PropertyPath("ComboItemsProperty");
this.SetBinding(ComboBox.ItemsSourceProperty, bind);
更新
根据msdn上的可用信息
- 当XAML作为内存对象加载时,原始XAML文件的许多设计时属性可能已经优化或丢失,并且在调用Save进行序列化时不会保留这些属性
- 序列化过程将取消对由各种标记扩展格式(如
或StaticResource
)生成的对象的通用引用Binding
我现在得出的结论是,不能通过
XAML
的序列化-反序列化
过程直接加载整个UserControl。我认为您可以通过用户控件的DataContext
上的Serialization-Deserialization
过程来加载对象实例,即您有数据绑定的自定义列表或对象。在XAML中,您是从文件加载用户控件吗?是的。我正在从我创建的文件加载用户控件。为什么要从文件加载?请显示从文件加载控件的代码。我添加了一些注释。我希望这是有意义的。不,这对我来说没有意义。为什么不将用户控件作为项目的一部分呢?谢谢你的回答。但它没有成功设置绑定。
Binding bind = new Binding();
bind.Mode = BindingMode.TwoWay;
bind.Source = this.DataContext;
bind.Path = new PropertyPath("ComboItemsProperty");
this.SetBinding(ComboBox.ItemsSourceProperty, bind);