我已经创建了一个自定义ComboBox,当ReadOnly属性被设置时,它将显示为一个TextBox:
<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;
}
我可以绕过它,但对于这个控件的某些使用来说会变得很尴尬。有什么建议吗?