【发布时间】:2011-08-26 14:55:59
【问题描述】:
我正在尝试构建一个本质上是 IPv4 地址“文本框”的 UserControl。
在 UserControl 中有 4 个 TextBox,其中一个 TextBlock 包含一个“.”。每个文本框之间:
<Grid Grid.IsSharedSizeScope="True">
<Grid.ColumnDefinitions>
<ColumnDefinition SharedSizeGroup="GroupA" />
<ColumnDefinition Width="*" />
<ColumnDefinition SharedSizeGroup="GroupA" />
<ColumnDefinition Width="*" />
<ColumnDefinition SharedSizeGroup="GroupA" />
<ColumnDefinition Width="*" />
<ColumnDefinition SharedSizeGroup="GroupA" />
</Grid.ColumnDefinitions>
<TextBox Grid.Column="0" TabIndex="0" x:Name="TextOctet1" />
<TextBlock Grid.Column="1" Text="." />
<TextBox Grid.Column="2" TabIndex="1" x:Name="TextOctet2" />
<TextBlock Grid.Column="3" Text="." />
<TextBox Grid.Column="4" TabIndex="2" x:Name="TextOctet3" />
<TextBlock Grid.Column="5" Text="." />
<TextBox Grid.Column="6" TabIndex="3" x:Name="TextOctet4" />
</Grid>
我希望我可以在我可以绑定到的控件上拥有一个名为 IPAddress 的 DependencyProperty,或者在 XAML“123.123.123.123”中设置一个默认值。
<local:IPBox IPAddress="123.123.123.123" />
我认为我可以使用 MultiBinding 和 IMultiValueConverter 之类的东西:
public class IPAddressConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return String.Format("{0}.{1}.{2}.{3}", values[0], values[1], values[2], values[3]);
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
{
return ((string)value).Split('.');
}
}
但我相信这与我想要的相反。 MultiValueConverter 会将多个业务逻辑属性合并为一个属性,供 TextBox 绑定。
相反,我想绑定一个业务逻辑属性(表示 IPv4 地址的字符串)并让每个八位字节显示在其自己的文本框中。然后,如果任何 Octet TextBoxes 发生变化,IPAddress 依赖属性将更新。
这可能吗?我是否以正确的方式思考这个问题?
【问题讨论】:
标签: wpf user-controls binding ip-address dependency-properties