Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.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文本框文本多触发器_Wpf_Textbox_Triggers - Fatal编程技术网

WPF文本框文本多触发器

WPF文本框文本多触发器,wpf,textbox,triggers,Wpf,Textbox,Triggers,我正在为一个人做一个联系人列表 我有一个ItemsControl,它对不同类型的联系信息使用DataTemplates。例如电话号码、电子邮件。。。等 对于电话号码,我希望用户有4个文本框,可以在其中编辑号码。4由于格式(他只能编辑数字,格式自动生成): +43(2)112233-2 每个部分都作为一个文本框。我想要一个主文本框,其中的整数以该格式写入。这意味着当用户编辑这4个文本框中的一个时,主文本框将实时填充格式化的数字 我在代码隐藏中实现了它,但由于我现在使用的是数据模板,我希望在XAML

我正在为一个人做一个联系人列表

我有一个
ItemsControl
,它对不同类型的联系信息使用
DataTemplates
。例如电话号码、电子邮件。。。等

对于电话号码,我希望用户有4个文本框,可以在其中编辑号码。4由于格式(他只能编辑数字,格式自动生成):

+43(2)112233-2

每个部分都作为一个文本框。我想要一个主文本框,其中的整数以该格式写入。这意味着当用户编辑这4个文本框中的一个时,主文本框将实时填充格式化的数字


我在代码隐藏中实现了它,但由于我现在使用的是数据模板,我希望在XAML中实现这一功能。您知道如何以正确格式重新生成主文本框的方式向所有这4个文本框添加触发器吗?

您应该能够将每个
文本框
绑定到相同的底层属性,并使用具有智能的转换器提取与该
文本框
相关的电话号码部分。伪代码:

<TextBox Text="{Binding PhoneNumber, Converter={StaticResource PhoneNumberConverter, ConverterParameter=CountryCode}}"/>
<TextBox Text="{Binding PhoneNumber, Converter={StaticResource PhoneNumberConverter, ConverterParameter=AreaCode}}"/>
...

...

如果您正在使用MVVM,请在
PhoneNumberViewModel
中使用单独的属性,而不是使用转换器。

如果我正确理解了这一点,并且您不必在主文本框中编辑电话号码,您可以使用多重绑定来完成此操作。以下是一个例子:

<DataTemplate x:Key="PhoneNumberTemplate">
  <StackPanel Orientation="Horizontal">
    <TextBox Name="tbPN1" />
    <TextBox Name="tbPN2" />
    <TextBox Name="tbPN3" />
    <TextBox Name="tbPN4" />
    <TextBox IsReadOnly="True">
      <TextBox.Text>
        <MultiBinding StringFormat="{}+{0} ({1}) {2} - {3}">
          <Binding Path="Text" ElementName="tbPN1" UpdateSourceTrigger="PropertyChanged" />
          <Binding Path="Text" ElementName="tbPN2" UpdateSourceTrigger="PropertyChanged" />
          <Binding Path="Text" ElementName="tbPN3" UpdateSourceTrigger="PropertyChanged" />
          <Binding Path="Text" ElementName="tbPN4" UpdateSourceTrigger="PropertyChanged" />
        </MultiBinding>
      </TextBox.Text>
    </TextBox>
  </StackPanel>
</DataTemplate>
然后,您的数据模板变成:

<DataTemplate x:Key="PhoneNumberTemplate">
  <StackPanel Orientation="Horizontal">
    <TextBox Text="{Binding Path=CountryCode, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Text="{Binding Path=AreaCode, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Text="{Binding Path=Number, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Text="{Binding Path=Suffix, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Text="{Binding Path=FullNumber, Mode=OneWay}" IsReadOnly="True" />
  </StackPanel>
</DataTemplate>


好,但如果我编辑其中一个文本框呢?基础值更改,但主文本框的UI不会更新。或我认为它不会被通知。要处理通知,请查看INotifyPropertyChanged接口:好的,谢谢。。为此,我决定使用MVVM。。因为做更改要容易得多:)好的,那太好了,我无法想象当绑定仅用其他元素指定而不是:Text=“{binding Path=PhoneNumber,Mode=TwoWay}”好的,我将以这种方式尝试,如何在作为我集合深处Person对象一部分的底层对象(PhoneNumber)中反映文本更改。。很遗憾,没有MVVM,我无法直接在XAML中完成某些事情。。。
<DataTemplate x:Key="PhoneNumberTemplate">
  <StackPanel Orientation="Horizontal">
    <TextBox Text="{Binding Path=CountryCode, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Text="{Binding Path=AreaCode, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Text="{Binding Path=Number, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Text="{Binding Path=Suffix, UpdateSourceTrigger=PropertyChanged}" />
    <TextBox Text="{Binding Path=FullNumber, Mode=OneWay}" IsReadOnly="True" />
  </StackPanel>
</DataTemplate>