我在这个问题上花了几天时间,似乎无法让它发挥作用。
我有一个用户控件,它使用以下代码保存到 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 给我带来了问题。当我将此用户控件的实例保存到文件中时,据我了解,{Binding ComboItemsProperty} 丢失了。所以,在我的用户控件的构造函数中,我有:
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”更改为用户控件的实例。没用。这告诉我绑定代码无法正常运行。
我相当确定问题是 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}),因为绑定没有保存。
我从一个文件中加载它,因为这个程序在某种意义上会有很多用户界面。每一个都将由不同的人使用该程序加载。