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は、私に問題を引き起こしているものです。このユーザーコントロールのインスタンスをファイルに保存すると、私の理解では、{BindingComboItemsProperty}が失われます。したがって、ユーザーコントロールのコンストラクターには次のものがあります。

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」の代わりに、this.DataContext定義したItemSourceプロパティを含む他のクラスオブジェクトインスタンスに設定する必要があります。

これを試して、

Binding bind = new Binding();  
bind.Mode = BindingMode.TwoWay;  
bind.Source = this.DataContext;  
bind.Path = new PropertyPath("ComboItemsProperty");  
this.SetBinding(ComboBox.ItemsSourceProperty, bind);  

アップデート

XamlWriter.Saveのシリアル化の制限によると、msdnで利用可能です。

  • 元のXAMLファイルの多くのデザイン時プロパティは、XAMLがメモリ内オブジェクトとして読み込まれるまでにすでに最適化または失われている可能性があり、[保存]を呼び出してシリアル化しても保持されません。
  • StaticResourceまたはなどのさまざまなマークアップ拡張形式によって作成されたオブジェクトへの一般的な参照Bindingは、シリアル化プロセスによって逆参照されます。

結論Serialization - Deserializationとして、私が今理解したのは、の手順でUserControl全体を直接ロードすることはできないということですXAMLSerialization - DeserializationUserControlのプロシージャ、DataContextつまりデータバインドされているカスタムリストまたはオブジェクトによってオブジェクトインスタンスをロードできると思います。

于 2012-09-06T18:42:39.207 に答える