WPF で ComboBox の選択肢を削除したら Binding error になる
◆ Show する前に消さない
[Window1.xaml]
[Windo1.xaml.cs]
こんな Window を作って こうやって開きます
使える選択肢だけ残しているのですが これだと
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ComboBoxItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'ComboBoxItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')
とエラーがでます
HorizontalAlignment も VerticalAlignment も Binding はしていません
いろいろ試してると Show より先に 消すとダメみたいで 先に Show しているとエラーは出ませんでした
最初の Show のときにレイアウト計算のために HorizontalAlignment が必要だけど消されてしまってるのでエラーというところでしょうか
先に Show する単純な方法で解決できるのですが 使っていたものの作りでは先に initialize してから Show するようになっていたので 対応がめんどうです
別になくなったものがエラーになるだけで動きには問題ないので放置でもいいのですけど なんかエラーがあると気持ち悪いですからね
<Window x:Class="wpf_sample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf_sample"
mc:Ignorable="d"
Title="Window1"
Height="320" Width="480">
<Grid>
<ComboBox x:Name="selectbox">
<ComboBox.Items>
<ComboBoxItem Tag="1">1-2</ComboBoxItem>
<ComboBoxItem Tag="1">1-2</ComboBoxItem>
<ComboBoxItem Tag="2">2-1</ComboBoxItem>
<ComboBoxItem Tag="2">2-2</ComboBoxItem>
</ComboBox.Items>
</ComboBox>
</Grid>
</Window>
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:wpf_sample"
mc:Ignorable="d"
Title="Window1"
Height="320" Width="480">
<Grid>
<ComboBox x:Name="selectbox">
<ComboBox.Items>
<ComboBoxItem Tag="1">1-2</ComboBoxItem>
<ComboBoxItem Tag="1">1-2</ComboBoxItem>
<ComboBoxItem Tag="2">2-1</ComboBoxItem>
<ComboBoxItem Tag="2">2-2</ComboBoxItem>
</ComboBox.Items>
</ComboBox>
</Grid>
</Window>
[Windo1.xaml.cs]
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
namespace wpf_sample
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
public void initializeComboBox(string preserve_key)
{
var remove_items = this.selectbox.Items.Cast<ComboBoxItem>()
.Where(e => (string)e.Tag != preserve_key).ToList();
foreach (var i in remove_items)
{
this.selectbox.Items.Remove(i);
}
}
}
}
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using System.Windows.Controls;
namespace wpf_sample
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
public void initializeComboBox(string preserve_key)
{
var remove_items = this.selectbox.Items.Cast<ComboBoxItem>()
.Where(e => (string)e.Tag != preserve_key).ToList();
foreach (var i in remove_items)
{
this.selectbox.Items.Remove(i);
}
}
}
}
こんな Window を作って こうやって開きます
var s = new Window1();
s.initializeComboBox("1");
s.Show();
s.initializeComboBox("1");
s.Show();
使える選択肢だけ残しているのですが これだと
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=HorizontalContentAlignment; DataItem=null; target element is 'ComboBoxItem' (Name=''); target property is 'HorizontalContentAlignment' (type 'HorizontalAlignment')
System.Windows.Data Error: 4 : Cannot find source for binding with reference 'RelativeSource FindAncestor, AncestorType='System.Windows.Controls.ItemsControl', AncestorLevel='1''. BindingExpression:Path=VerticalContentAlignment; DataItem=null; target element is 'ComboBoxItem' (Name=''); target property is 'VerticalContentAlignment' (type 'VerticalAlignment')
とエラーがでます
HorizontalAlignment も VerticalAlignment も Binding はしていません
いろいろ試してると Show より先に 消すとダメみたいで 先に Show しているとエラーは出ませんでした
最初の Show のときにレイアウト計算のために HorizontalAlignment が必要だけど消されてしまってるのでエラーというところでしょうか
先に Show する単純な方法で解決できるのですが 使っていたものの作りでは先に initialize してから Show するようになっていたので 対応がめんどうです
別になくなったものがエラーになるだけで動きには問題ないので放置でもいいのですけど なんかエラーがあると気持ち悪いですからね