Wpf PropertyChanged 在一个方法中使用按钮发送两次到两个变量
Wpf PropertyChanged two time to two variable in one method with button send
我无法更新变量。我有一个带有自定义文本框的用户控件 class。
WPF UC 代码。
<TextBox x:Name="wwwBox" TextChanged="WwwBoxTextChanged" Width="{Binding BoxWidth}" Text="{Binding LinkAddress,Mode=TwoWay}"/>
我尝试使用 Mode=TwoWay 和不使用它。
WPF UC class 代码。
public partial class TextBoxWebControl : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public int BoxWidth { get; set; }
public bool IsValid { get; set; }
public string LinkAddress { get; set; }
public TextBoxWebControl()
{
InitializeComponent();
DataContext = this;
IsValid = false;
}
public void WwwBoxTextChanged(object sender, TextChangedEventArgs args)
{
Uri uriResult;
IsValid = Uri.TryCreate(wwwBox.Text, UriKind.Absolute, out uriResult)
&& (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
PropertyChanged(this, new PropertyChangedEventArgs(nameof(IsValid)));
}
}
当我将第二个 PropertyChanged 添加到 link 地址时,我无法向文本框写入任何内容。接下来我需要通过按钮发送 LinkAddres(名为 wwwBox 的文本框的内容)。这是 MainWindow WPF 代码
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="1">
<Label>Enter the website link..</Label>
</StackPanel>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Grid.Row="2">
<uc:TextBoxWebControl x:Name="wwwLink" BoxWidth="500" />
</StackPanel>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Grid.Row="3">
<Button Click="GetWebSiteDetail" Tag="{ Binding Path= LinkAddress, ElementName=wwwLink,UpdateSourceTrigger=PropertyChanged}" Content="Get all!" Width="100" Visibility="{Binding Path= IsValid, ElementName=wwwLink,UpdateSourceTrigger=PropertyChanged,Converter={StaticResource VisibleIfTrueConverter }}"/>
</StackPanel>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Grid.Row="4">
<Label Content="Bad address" >
<Label.Style>
<Style TargetType="{x:Type Label}">
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path= IsValid,ElementName=wwwLink,UpdateSourceTrigger=PropertyChanged}" Value="True">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path= IsValid,ElementName=wwwLink,UpdateSourceTrigger=PropertyChanged}" Value="False">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
</StackPanel>
和主要 window WPF class 代码
private void GetWebSiteDetail(object sender, RoutedEventArgs e)
{
string link = new WebDetail(((Button)sender).Tag.ToString()); //here always null
}
是我的第一个wpf项目。很高兴收到有关如何解决我的问题以及如何升级我的代码的任何建议。
您需要为数据绑定 LinkAddress
属性 引发 PropertyChanged
事件,以便 Tag
属性 得到更新:
private string _linkAddress;
public string LinkAddress
{
get { return _linkAddress; }
set { _linkAddress = value; PropertyChanged(this, new PropertyChangedEventArgs(nameof(LinkAddress))); }
}
此外,无需为数据绑定 属性 处理 TextChanged
事件。您不妨将代码从 WwwBoxTextChanged
移动到 LinkAddress
的 setter。
我无法更新变量。我有一个带有自定义文本框的用户控件 class。 WPF UC 代码。
<TextBox x:Name="wwwBox" TextChanged="WwwBoxTextChanged" Width="{Binding BoxWidth}" Text="{Binding LinkAddress,Mode=TwoWay}"/>
我尝试使用 Mode=TwoWay 和不使用它。 WPF UC class 代码。
public partial class TextBoxWebControl : UserControl, INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
public int BoxWidth { get; set; }
public bool IsValid { get; set; }
public string LinkAddress { get; set; }
public TextBoxWebControl()
{
InitializeComponent();
DataContext = this;
IsValid = false;
}
public void WwwBoxTextChanged(object sender, TextChangedEventArgs args)
{
Uri uriResult;
IsValid = Uri.TryCreate(wwwBox.Text, UriKind.Absolute, out uriResult)
&& (uriResult.Scheme == Uri.UriSchemeHttp || uriResult.Scheme == Uri.UriSchemeHttps);
PropertyChanged(this, new PropertyChangedEventArgs(nameof(IsValid)));
}
}
当我将第二个 PropertyChanged 添加到 link 地址时,我无法向文本框写入任何内容。接下来我需要通过按钮发送 LinkAddres(名为 wwwBox 的文本框的内容)。这是 MainWindow WPF 代码
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Center" Grid.Row="1">
<Label>Enter the website link..</Label>
</StackPanel>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Grid.Row="2">
<uc:TextBoxWebControl x:Name="wwwLink" BoxWidth="500" />
</StackPanel>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Grid.Row="3">
<Button Click="GetWebSiteDetail" Tag="{ Binding Path= LinkAddress, ElementName=wwwLink,UpdateSourceTrigger=PropertyChanged}" Content="Get all!" Width="100" Visibility="{Binding Path= IsValid, ElementName=wwwLink,UpdateSourceTrigger=PropertyChanged,Converter={StaticResource VisibleIfTrueConverter }}"/>
</StackPanel>
<StackPanel HorizontalAlignment="Center" VerticalAlignment="Top" Grid.Row="4">
<Label Content="Bad address" >
<Label.Style>
<Style TargetType="{x:Type Label}">
<Setter Property="Visibility" Value="Hidden"/>
<Style.Triggers>
<DataTrigger Binding="{Binding Path= IsValid,ElementName=wwwLink,UpdateSourceTrigger=PropertyChanged}" Value="True">
<Setter Property="Visibility" Value="Hidden"/>
</DataTrigger>
<DataTrigger Binding="{Binding Path= IsValid,ElementName=wwwLink,UpdateSourceTrigger=PropertyChanged}" Value="False">
<Setter Property="Visibility" Value="Visible"/>
</DataTrigger>
</Style.Triggers>
</Style>
</Label.Style>
</Label>
</StackPanel>
和主要 window WPF class 代码
private void GetWebSiteDetail(object sender, RoutedEventArgs e)
{
string link = new WebDetail(((Button)sender).Tag.ToString()); //here always null
}
是我的第一个wpf项目。很高兴收到有关如何解决我的问题以及如何升级我的代码的任何建议。
您需要为数据绑定 LinkAddress
属性 引发 PropertyChanged
事件,以便 Tag
属性 得到更新:
private string _linkAddress;
public string LinkAddress
{
get { return _linkAddress; }
set { _linkAddress = value; PropertyChanged(this, new PropertyChangedEventArgs(nameof(LinkAddress))); }
}
此外,无需为数据绑定 属性 处理 TextChanged
事件。您不妨将代码从 WwwBoxTextChanged
移动到 LinkAddress
的 setter。