2

我在这个问题上花了几天时间,似乎无法让它发挥作用。

我有一个用户控件,它使用以下代码保存到 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}),因为绑定没有保存。

我从一个文件中加载它,因为这个程序在某种意义上会有很多用户界面。每一个都将由不同的人使用该程序加载。

4

1 回答 1

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 上可用 的 XamlWriter.Save 的序列化限制,

  • 原始 XAML 文件的许多设计时属性在 XAML 作为内存对象加载时可能已经优化或丢失,并且在调用 Save 进行序列化时不会保留。
  • 由各种标记扩展格式(例如StaticResourceor Binding)生成的对对象的公共引用将被序列化过程取消引用。

结论Serialization - Deserialization,我现在得出的结论是,您不能通过程序直接加载整个 UserControl XAMLSerialization - Deserialization我认为您可以通过 UserControl上的过程加载对象实例,DataContext即您具有数据绑定的自定义列表或对象。

于 2012-09-06T18:42:39.207 回答