我已经创建了一个自定义搜索用户控件。
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}" />
出于测试目的,当我在初始化时更改视图模型中的属性值时,将显示正确的值,并且程序“到达”定义了PropertyChangedCallback(SearchTextPropertyChanged)
的部分。
但是,当我在文本框中键入内容时,viewmodel中的属性似乎没有更新。我想念什么?有人可以帮帮我吗?
答案 0 :(得分:2)
在当前实现中,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();
}
}
并且Binding应该使用HeaderSearchControl作为源:
<TextBox Style="{StaticResource SearchTextBox}"
Text="{Binding Path=SearchText, RelativeSource={RelativeSource AncestorType=UserControl}}" />