自定义 UserControl 的自定义 DependencyProperty 未正确绑定
Custom DependencyProperty of custom UserControl not binding properly
我已经创建了自定义搜索用户控件。
public partial class HeaderSearchControl : UserControl
{
public static DependencyProperty SearchTextProperty =
DependencyProperty.Register("SearchText", typeof(string), typeof(HeaderSearchControl),
new PropertyMetadata(new PropertyChangedCallback(SearchTextPropertyChanged)));
public string SearchText
{
get { return (string)GetValue(SearchTextProperty); }
set { SetValue(SearchTextProperty, value); }
}
public HeaderSearchControl()
{
InitializeComponent();
}
private static void SearchTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = d as HeaderSearchControl;
if(control != null)
{
control.SearchBox.Text = (string)e.NewValue;
}
}
}
XAML 看起来像这样:
<Border>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0">
<TextBox x:Name="SearchBox" Style="{StaticResource SearchTextBox}" Text="{Binding Path=SearchText}" />
</Border>
<StackPanel Orientation="Horizontal" Grid.Column="1">
<Button Style="{StaticResource IconSymbolButton}" Content="" Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}" Margin="0 2 2 2"/>
</StackPanel>
</Grid>
</Border>
视图模型中的 属性 如下所示:
private string _sessionFilter;
public string SessionFilter
{
get { return _sessionFilter; }
set
{
_sessionFilter = value;
}
}
我是这样使用的:
<local:HeaderSearchControl VerticalAlignment="Center"
SearchText="{Binding SessionFilter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
出于测试目的,当我在初始化时更改视图模型中 属性 的值时,显示了正确的值,程序 "reaches" 部分,其中 PropertyChangedCallback(SearchTextPropertyChanged)
已定义。
但是,当我在文本框中输入时,viewmodel 中的 属性 似乎没有更新。我错过了什么?有人可以帮帮我吗?
在当前的实现中,SearchTextPropertyChanged
删除了 Text
绑定,因此没有从 HeaderSearchControl
到绑定 属性 的更新。 SearchTextPropertyChanged
必须去:
public partial class HeaderSearchControl : UserControl
{
public static DependencyProperty SearchTextProperty = DependencyProperty.Register
(
"SearchText",
typeof(string),
typeof(HeaderSearchControl),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);
public string SearchText
{
get { return (string)GetValue(SearchTextProperty); }
set { SetValue(SearchTextProperty, value); }
}
public HeaderSearchControl()
{
InitializeComponent();
}
}
并且绑定应该使用 HeaderSearchControl 作为源:
<TextBox Style="{StaticResource SearchTextBox}"
Text="{Binding Path=SearchText, RelativeSource={RelativeSource AncestorType=UserControl}}" />
我已经创建了自定义搜索用户控件。
public partial class HeaderSearchControl : UserControl
{
public static DependencyProperty SearchTextProperty =
DependencyProperty.Register("SearchText", typeof(string), typeof(HeaderSearchControl),
new PropertyMetadata(new PropertyChangedCallback(SearchTextPropertyChanged)));
public string SearchText
{
get { return (string)GetValue(SearchTextProperty); }
set { SetValue(SearchTextProperty, value); }
}
public HeaderSearchControl()
{
InitializeComponent();
}
private static void SearchTextPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
var control = d as HeaderSearchControl;
if(control != null)
{
control.SearchBox.Text = (string)e.NewValue;
}
}
}
XAML 看起来像这样:
<Border>
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="Auto" />
</Grid.ColumnDefinitions>
<Border Grid.Column="0">
<TextBox x:Name="SearchBox" Style="{StaticResource SearchTextBox}" Text="{Binding Path=SearchText}" />
</Border>
<StackPanel Orientation="Horizontal" Grid.Column="1">
<Button Style="{StaticResource IconSymbolButton}" Content="" Width="{Binding ActualHeight, RelativeSource={RelativeSource Self}}" Margin="0 2 2 2"/>
</StackPanel>
</Grid>
</Border>
视图模型中的 属性 如下所示:
private string _sessionFilter;
public string SessionFilter
{
get { return _sessionFilter; }
set
{
_sessionFilter = value;
}
}
我是这样使用的:
<local:HeaderSearchControl VerticalAlignment="Center"
SearchText="{Binding SessionFilter, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
出于测试目的,当我在初始化时更改视图模型中 属性 的值时,显示了正确的值,程序 "reaches" 部分,其中 PropertyChangedCallback(SearchTextPropertyChanged)
已定义。
但是,当我在文本框中输入时,viewmodel 中的 属性 似乎没有更新。我错过了什么?有人可以帮帮我吗?
在当前的实现中,SearchTextPropertyChanged
删除了 Text
绑定,因此没有从 HeaderSearchControl
到绑定 属性 的更新。 SearchTextPropertyChanged
必须去:
public partial class HeaderSearchControl : UserControl
{
public static DependencyProperty SearchTextProperty = DependencyProperty.Register
(
"SearchText",
typeof(string),
typeof(HeaderSearchControl),
new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault)
);
public string SearchText
{
get { return (string)GetValue(SearchTextProperty); }
set { SetValue(SearchTextProperty, value); }
}
public HeaderSearchControl()
{
InitializeComponent();
}
}
并且绑定应该使用 HeaderSearchControl 作为源:
<TextBox Style="{StaticResource SearchTextBox}"
Text="{Binding Path=SearchText, RelativeSource={RelativeSource AncestorType=UserControl}}" />