Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.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
C# 为什么使用Convert方法在WPF组合框中转换回值?_C#_Wpf_Data Binding_Ivalueconverter - Fatal编程技术网

C# 为什么使用Convert方法在WPF组合框中转换回值?

C# 为什么使用Convert方法在WPF组合框中转换回值?,c#,wpf,data-binding,ivalueconverter,C#,Wpf,Data Binding,Ivalueconverter,确切的问题是-为什么使用Convert而不是ConvertBack,以及为什么这里首先需要ConvertBack 问题 下面是我的问题的例子,我试图简化事情。这是一个普通的WPF,没有第三方库,问题本身就是经典的主细节 我有城市列表框和datagrid,其中列出了我所有的朋友和电话。当我选择listbox时,datagrid应该刷新并显示来自所选城市的人。datagrid如下所示: Name | Phone | PhoneType Mark | 76447 | cellphone ... ty

确切的问题是-为什么使用Convert而不是ConvertBack,以及为什么这里首先需要ConvertBack

问题 下面是我的问题的例子,我试图简化事情。这是一个普通的WPF,没有第三方库,问题本身就是经典的主细节

我有城市列表框和datagrid,其中列出了我所有的朋友和电话。当我选择listbox时,datagrid应该刷新并显示来自所选城市的人。datagrid如下所示:

Name | Phone | PhoneType
Mark | 76447 | cellphone
...
typeID | PhoneType | PhoneDescription
1      | cellphone | NULL
2      | neighbour | call only in case of emergency
这里的关键问题是PhoneType列。每个手机都应该是一个组合框,里面装满了从数据库中提取的预定义电话类型。扭曲之处在于db结构。是这样的:

Name | Phone | PhoneType
Mark | 76447 | cellphone
...
typeID | PhoneType | PhoneDescription
1      | cellphone | NULL
2      | neighbour | call only in case of emergency
在my datagrid组合框中,应显示PhoneType,但如果存在PhoneDescription,则应使用它而不是普通的PhoneType

问题到此为止。你和我在一起吗

实施 为了在datagrid中使用combobox,我必须使用内部带有combobox的模板列,而不是combobox datagrid列。原因如下:。这是我的组合框:

<ComboBox ItemsSource="{Binding Path=PhoneTypesList, 
          RelativeSource={RelativeSource AncestorType={x:Type Window}}}"  
Combobox应该知道我朋友的电话类型的当前值,所以这里是我如何绑定这些值的——一方面,我设置了PhoneType记录中的typeID用于匹配,另一方面,我设置了应该使用friend记录中的typeID。这样WPF就知道哪些电话类型的记录应该用作当前值

如果您不是100%熟悉此绑定,下面是一个很好的解释:

顺便说一句,typeID被使用了两次,因为一般来说,我更喜欢对数据库中的相关字段和外键字段使用完全相同的名称

我已经有了列表,我已经完成了匹配,现在-对于显示,我不能只使用DisplayMemberPath,因为我需要更动态的东西

  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding Converter={StaticResource PhoneTypeConverter}}"/>
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>
错误 我编译整个应用程序,运行它,点击任何城市。它按预期工作,很好

然后我点击另一个城市。应用程序考虑了一下,然后在刷新city listbox或datagrid之前,它会异常崩溃,请参见上面的标记行:

无法强制转换类型为的对象 要键入的“System.String” “MyBuilderApp.PhoneTypeRecord”


有了这个,我不知道发生了什么。为什么字符串被传递到转换???它看起来更像ConvertBack。

在我看来,textblock绑定到从PhoneTypesList返回的内容。然后is使用转换器,它需要一个PhoneTypeRecord。 我想PhoneTypesList是一个PhoneTypeRecord列表,对吗? 我注意到,在转换器中,我得到了完整的列表,而不是列表中的每个元素。所以你实际上得到了PhoneTypeRecord的列表/集合/可观察的集合。核实一下

您还可以在转换器中添加如下条件:

if(value != typeof(what_you_are_expecting) throw new InvalidOperationException("something is wrong");

我想在这种情况下,使用一个。它将处理描述为null的情况,并为您使用以下类型:

<ComboBox>
  <ComboBox.ItemTemplate>
    <DataTemplate>
      <TextBlock>
         <TextBlock.Text>
           <PriorityBinding>
             <Binding Path="PhoneDescription" />
             <Binding Path="PhoneType" />
           </PriorityBinding>
         </TextBlock.Text>
      </TextBlock>
    </DataTemplate>
  </ComboBox.ItemTemplate>
</ComboBox>

TextBlock绑定到PhoneTypesList的元素,而不是整个集合。PhoneTypesList是PhoneTypeRecord的列表-正确。在转换器中,我得到了完整的列表,而不是列表中的每个元素-不正确。它是文本块值的转换器,而不是整个组合框的ItemsSource转换器。关于检查传入的类型——在第一次单击之后,它只是PhoneTypeRecord几次,每次都是针对列表中的每个元素。在第二次单击时,输入的第一种类型是字符串。在转换器中放置一个断点,然后查看给定的字符串。这可能有助于您确定问题。@Rachel,您在VS;-空的非空字符串。感谢您的这种方法,但总的来说,我想了解事情是如何工作的。这里真的很奇怪,转换是用来转换回来的!嗯,我不能完全确定为什么在选择另一个项目后会将字符串传递给转换器,但是绑定的DataContext正在以某种方式更改为字符串。如果转换器执行铸态转换,并在其为null时返回,则它可能会工作。