WPF 数据网格中未初始化绑定的 ComboBox DataTemplate

ComboBox DataTemplate in WPF datagrid with binding not initialized

我有一个模型绑定列表和一个数据网格。值可以是几种数据类型(bool、double)。

    public class Model
    {
        public object Value { get; set; }
    }

public void Initialize()
{
            var models = new BindingList<Model>();
            models.Add(new Model(){ Value = "hello"});
            models.Add(new Model(){Value=true});
            signals.ItemsSource = models;
}

我想在数据网格中显示数据,我想对数字使用文本框,但是对布尔值使用 combo(true/false) values.So 我实现了 bool2string 转换器和 DataTemplateSelector。在我的示例中,我有一个文本列和一个模板列显示相同的数据。当我启动应用程序时,组合值未初始化(未选择任何内容)。一旦我开始使用值,一切正常,值正确同步(如果我更改一列中的值,它将传播到另一列)。你知道我犯了什么错误吗?

public class BoolToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        return ((bool)value == true) ? "true" : "false";
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var comboValue = (value as ComboBoxItem).Content.ToString();
        return (String.Compare(comboValue, "true", StringComparison.InvariantCultureIgnoreCase) == 0);
    }
}

public class DynamicDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        var element = container as FrameworkElement;
        var signal = item as Model;
        if (element != null && signal != null)
        {
            if (signal.Value is bool)
                return element.FindResource("BoolTemplate") as DataTemplate;
            else
                return element.FindResource("TextTemplate") as DataTemplate;
        }
        return null;
    }
}

我的 xaml 如下所示:

<Window.Resources>
    <comboQuestion:DynamicDataTemplateSelector x:Key="DataTemplateSelector"/>
    <comboQuestion:BoolToStringConverter x:Key="BoolToStringConverter"/>
</Window.Resources>
<Grid>
    <DataGrid Grid.Row="1"  Name="signals" AutoGenerateColumns="False"  ItemsSource="{Binding}" >
        <DataGrid.Resources>
            <DataTemplate x:Key="BoolTemplate">
                <ComboBox SelectedItem="{Binding Value, Converter={StaticResource BoolToStringConverter}, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged}">
                    <ComboBoxItem>true</ComboBoxItem>
                    <ComboBoxItem>false</ComboBoxItem>
                </ComboBox>
            </DataTemplate>
            <DataTemplate x:Key="TextTemplate">
                <TextBox Text="{Binding Value, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"/>
            </DataTemplate>
        </DataGrid.Resources>
        <DataGrid.Columns>
            <DataGridTextColumn Header="TextValue" Binding="{Binding Value}"/>
            <DataGridTemplateColumn Header="DynamicValue" CellTemplateSelector="{StaticResource DataTemplateSelector}"/>
        </DataGrid.Columns>
    </DataGrid>
</Grid>

编辑: 我试图将 SelectedItem 更改为 SelectedValue 并且我还尝试将转换器的 Convert 部分更改为:

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var cbi = new ComboBoxItem();
        cbi.Content = ((bool)value == true) ? "true" : "false";
        return cbi;
    }

但是,行为保持不变。

您可以使用以下转换器将布尔值转换为索引号:

public class BooleanToIndexConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((bool)value == true) ? 0 : 1;   
        }

        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            return ((int)value == 0) ? true : false;
        }
    }

然后绑定到 ComboBox 上的 SelectedIndex

SelectedIndex="{Binding Value, Converter={StaticResource BooleanToIndexConverter}}