私はこの問題に数日を費やしましたが、それを機能させることができないようです。
次のコードで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})。
このプログラムはある意味で多くのユーザーインターフェイスを備えているので、ファイルからロードします。それぞれがプログラムを使用して異なる人によってロードされます。