我在这个问题上花了几天时间,似乎无法让它发挥作用。
我有一个用户控件,使用以下代码保存到xaml文件中:
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>
组合框中的ItemsSource正在给我带来麻烦。 当我将此usercontrol的实例保存到文件中时,根据我的理解,{Binding ComboItemsProperty}将丢失。所以,在我的usercontrol的构造函数中,我有:
public UserInputEnum()
{
InitializeComponent();
Binding bind = new Binding();
bind.Mode = BindingMode.TwoWay;
bind.Source = this;
bind.Path = new PropertyPath("ComboItemsProperty");
this.SetBinding(ComboBox.ItemsSourceProperty, bind);
}
这是我的属性和更改后的方法:
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时,组合框会更新。
所以,我带走了{Binding ComboItemsProperty}并尝试在代码中设置绑定,如上所述将'this'更改为用户控件的实例。没工作。这告诉我绑定代码无法正常运行。
我很确定bindSource是问题所在。当它在UserControl中时,我不确定该放在那里。
编辑:
从文件加载usercontrol的代码:
FileStream stream = File.Open("usercontrol.xaml", FileMode.Open, FileAccess.Read);
ComboBox cmb = System.Windows.Markup.XamlReader.Load(stream) as ComboBox;
它加载非常好。 Binding只是不起作用(ItemsSource = {Binding ComboItemsProperty}),因为Bindings没有保存。
我从文件加载它,因为这个程序在某种意义上会有很多用户界面。每个人都将使用该程序由不同的人加载。
答案 0 :(得分:1)
您需要包含属性 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上提供的Serialization Limitations of XamlWriter.Save,
StaticResource
或Binding
)对对象的公共引用。 结论,我现在做的是你不能通过Serialization - Deserialization
XAML
程序直接加载UserControl。我认为你可以通过Serialization - Deserialization
程序在UserControl的DataContext
上加载对象实例,即你有数据绑定的自定义列表或对象。