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

时间:2012-09-06 15:57:02

标签: wpf binding

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

我有一个用户控件,使用以下代码保存到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没有保存。

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

1 个答案:

答案 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

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

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