Wpf 如何在UserControl中设置与Combox的绑定?

Wpf 如何在UserControl中设置与Combox的绑定?,wpf,binding,Wpf,Binding,我在这个问题上花了好几天时间,似乎无法使它发挥作用 我有一个用户控件,它用以下代码保存到xaml文件中: StringBuilder outstr = new StringBuilder(); XmlWriterSettings settings = new XmlWriterSettings(); settings.Indent = true; settings.OmitXmlDeclaration = true;

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

我有一个用户控件,它用以下代码保存到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>
以下是我的属性和更改的方法:

    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);