ReadOnlyが設定されている場合にTextBoxとして表示されるカスタムComboBoxを作成しました。
<local:BoolToVisibilityConverter FalseValue="Hidden" TrueValue="Visible" x:Key="BoolVis" />
<local:BoolToVisibilityConverter FalseValue="Visible" TrueValue="Hidden" x:Key="BoolVisRev" />
<Style TargetType="{x:Type local:ComboBoxG}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type local:ComboBoxG}">
<Border Background="{TemplateBinding Background}"
BorderBrush="{TemplateBinding BorderBrush}"
BorderThickness="{TemplateBinding BorderThickness}">
<Grid>
<ComboBox ItemsSource="{TemplateBinding ItemsSource}"
DisplayMemberPath="{TemplateBinding DisplayMemberPath}"
SelectedValuePath="{TemplateBinding SelectedValuePath}"
SelectedIndex="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=SelectedIndex, Mode=TwoWay}"
Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsReadOnly, Converter={StaticResource BoolVisRev}}"
IsDropDownOpen="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsDropDownOpen, Mode=TwoWay}"
IsTabStop="False">
</ComboBox>
<TextBox Text="{TemplateBinding Text}"
Visibility="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=IsReadOnly, Converter={StaticResource BoolVis}}"
IsTabStop="False">
</TextBox>
</Grid>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
インスタンス化して値を一度に設定する場合を除いて、正常に機能しています。これは機能しません...
private void One_OnClick(object sender, RoutedEventArgs e)
{
cmb = new ComboBoxG();
Stack.Children.Add(cmb);
var dict = new Dictionary<int, string> { { 0, "aaa" }, { 1, "bbb" }, { 2, "ccc" }, { 3, "ddd" }, };
cmb.ItemsSource = dict;
cmb.DisplayMemberPath = "Value";
cmb.SelectedValuePath = "Key";
cmb.SelectedValue = 3;
}
...これは...
private void One_OnClick(object sender, RoutedEventArgs e)
{
cmb = new ComboBoxG();
Stack.Children.Add(cmb);
var dict = new Dictionary<int, string> { { 0, "aaa" }, { 1, "bbb" }, { 2, "ccc" }, { 3, "ddd" }, };
cmb.ItemsSource = dict;
cmb.DisplayMemberPath = "Value";
cmb.SelectedValuePath = "Key";
cmb.Loaded += cmb_Loaded;
}
private void cmb_Loaded(object sender, RoutedEventArgs e)
{
cmb.SelectedValue = 3;
}
だから私はそれを回避することができますが、それはこのコントロールのいくつかの使用のためにそれを厄介にします。何か提案をお願いします。