Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 使用Silverlight中的转换器绑定到ComboBox_Wpf_Silverlight_Xaml_Data Binding_Combobox - Fatal编程技术网

Wpf 使用Silverlight中的转换器绑定到ComboBox

Wpf 使用Silverlight中的转换器绑定到ComboBox,wpf,silverlight,xaml,data-binding,combobox,Wpf,Silverlight,Xaml,Data Binding,Combobox,我有一个数值,我希望在显示时将其转换为更加用户友好的字符串格式。我已经有了一个名为FlightLevelConverter的IValueConverter,我正在使用它为正常的TextBlockUI项执行此操作,它工作正常 我现在希望将转换器应用到高度选择的组合框中,但我无法让它工作 这是我用于组合框的XAML的相关部分: <UserControl.Resources> <status:FlightLevelConverter x:Key="FlightLevelCon

我有一个数值,我希望在显示时将其转换为更加用户友好的字符串格式。我已经有了一个名为
FlightLevelConverter
的IValueConverter,我正在使用它为正常的
TextBlock
UI项执行此操作,它工作正常

我现在希望将转换器应用到高度选择的组合框中,但我无法让它工作

这是我用于组合框的
XAML的相关部分:

<UserControl.Resources>
    <status:FlightLevelConverter x:Key="FlightLevelConverter"/>
</UserControl.Resources>
...
<ComboBox x:Name="AltitudeCombo" Grid.Row="0" Grid.Column="3" Width="100">
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Converter={StaticResource FlightLevelConverter}}"/>
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

...
它显示未转换的数值,而不是漂亮的字符串值。我没有得到任何错误,如果我在转换器中设置断点,它不会被命中,这表明转换器从未被调用

我花了整个上午在互联网上搜寻,特别是StackOverflow,试图发现我做错了什么,但没有发现任何有用的东西


为什么我的转换器没有被调用?我做错了什么?

如果ComboBox.IsEditable==true,则ComboBox.ItemTemplate不适用于ComboBox的主要部分。它仅适用于下拉列表条目。尝试设置ComboBox.IsEditable==false。这可能会有所帮助。

如果ComboBox.IsEditable==true,则ComboBox.ItemTemplate不适用于ComboBox的主要部分。它仅适用于下拉列表条目。尝试设置ComboBox.IsEditable==false。这可能会有所帮助。

如何将项目添加到组合框中

您应该将属性设置为数值的集合,例如

List<double> values = new List<double>();
values.Add(2.1);
values.Add(3.2);
values.Add(4.3);
values.Add(5.4);
AltitudeCombo.ItemsSource = values;

不会应用ItemTemplate及其转换器的绑定。

如何将项目添加到组合框

您应该将属性设置为数值的集合,例如

List<double> values = new List<double>();
values.Add(2.1);
values.Add(3.2);
values.Add(4.3);
values.Add(5.4);
AltitudeCombo.ItemsSource = values;

不会应用ItemTemplate及其转换器的绑定。

这里是一个简短的工作示例。您可以比较代码

XAML:


C#:

公共类MyList:列表{
公共MyList(){
AddRange(新[]{1,2,3,4,5,6});
}
}
公共类MyConverter:IValueConverter{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性){
返回字符串。格式(“,值);
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性){
抛出新的NotImplementedException();
}
}

这是一个简短的工作示例。您可以比较代码

XAML:


C#:

公共类MyList:列表{
公共MyList(){
AddRange(新[]{1,2,3,4,5,6});
}
}
公共类MyConverter:IValueConverter{
公共对象转换(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性){
返回字符串。格式(“,值);
}
公共对象转换回(对象值、类型targetType、对象参数、System.Globalization.CultureInfo区域性){
抛出新的NotImplementedException();
}
}

默认情况下,组合框不可编辑。无需设置
IsEditable
。Silverlight组合框不支持编辑,并且IsEditable始终为false。默认情况下,组合框不可编辑。无需设置
IsEditable
。Silverlight组合框不支持编辑,并且IsEditable始终为false。啊哈。这似乎就是问题所在。我正在按照您的第二个示例添加项目。我将尝试设置ItemsSource。谢谢,不客气。还请注意,绑定有一个属性,这可能会消除对(简单)converter.Aha的需要。这似乎就是问题所在。我正在按照您的第二个示例添加项目。我将尝试设置ItemsSource。谢谢,不客气。还请注意,绑定具有一个属性,这可能会消除对(简单)转换器的需要。请发布整个xaml文件以及填充项的方式。请发布整个xaml文件以及填充项的方式。
<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:bys="clr-namespace:WpfApplication1"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <Grid>
        <Grid.Resources>
            <bys:MyList x:Key="lst"/>
            <bys:MyConverter x:Key="myConverter"/>
        </Grid.Resources>
        <ComboBox ItemsSource="{StaticResource lst}" SelectedIndex="0">
            <ComboBox.ItemTemplate>
                <DataTemplate>
                    <TextBlock Text="{Binding Converter={StaticResource myConverter}}"/>
                </DataTemplate>
            </ComboBox.ItemTemplate>
        </ComboBox >
    </Grid>
</Window>
public class MyList : List<int> {
    public MyList() {
        AddRange(new[] { 1, 2, 3, 4, 5, 6 });
    }
}

public class MyConverter : IValueConverter {

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        return String.Format("<<{0}>>", value);
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) {
        throw new NotImplementedException();
    }
}