Xaml ViewModel中的值发生更改时,在回调期间不会触发PropertyChangedCallback
我有一个使用SearchBox用户控件的视图,SearchBox有两个单选按钮来选择搜索模式-即时和延迟。我已经将searchmodes绑定到SearchMode属性,并且为搜索模式创建了一个自定义依赖项属性 看法 SearchBox.xamlXaml ViewModel中的值发生更改时,在回调期间不会触发PropertyChangedCallback,xaml,mvvm,data-binding,dependency-properties,caliburn.micro,Xaml,Mvvm,Data Binding,Dependency Properties,Caliburn.micro,我有一个使用SearchBox用户控件的视图,SearchBox有两个单选按钮来选择搜索模式-即时和延迟。我已经将searchmodes绑定到SearchMode属性,并且为搜索模式创建了一个自定义依赖项属性 看法 SearchBox.xaml <UserControl x:Class = "abc.SearchBox" DataContext="{Binding RelativeSource={RelativeSource Self}}" >
<UserControl x:Class = "abc.SearchBox"
DataContext="{Binding RelativeSource={RelativeSource Self}}" >
<UserControl.Resources>
<converters:EnumToBooleanConverter x:Key="EnumToBooleanConverter" />
</UserControl.Resources>
<StackPanel Orientation="Vertical">
<RadioButton Content="{lex:Loc SearchBox:SearchModelInstatOption}"
IsChecked="{Binding Path=SearchMode, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static local:Mode.Instant}}" />
<RadioButton Content="{lex:Loc SearchBox:SearchModeDelayedOption}"
IsChecked="{Binding Path=SearchMode, Converter={StaticResource EnumToBooleanConverter}, ConverterParameter={x:Static local:Mode.Delayed}}" />
</StackPanel>
</UserControl>
我希望每次在回拨期间设置SearchMode时,即在ViewModel.cs中调用ActivateLastSelectedSearchMode()时,都会触发OnIsSearchModeChanged()。我完全不懂1.我错过了什么地方,就无法取得成功
//snip
private Mode mSearchMode;
public Mode SearchMode
{
get
{
return mSearchMode;
}
set
{
mSearchMode = value;
NotifyOfPropertyChange(()=>SearchMode); //Change
}
}
反映出来的变化有什么不同吗?另一个选项是为用户控件创建自定义约定
反映出来的变化有什么不同吗?另一个选项是为用户控件创建自定义约定,您应该在视图模型中创建一个事件,并从代码隐藏中订阅它 在视图模型中:
public event SearchModeAction SearchModeChanged;
public delegate void SearchModeAction(object sender, EventArgs e);
public void SearchModeHasChanged()
{
SearchModeAction Handler = SearchModeChanged;
if (Handler != null)
{
Handler(this, null);
}
}
private void ActivateLastSelectedSearchMode(Mode lastselectedMode)
{
// Sets the last selected mode to the search mode
SearchMode = lastselectedMode;
SearchModeHasChanged()
}
在代码隐藏中:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
((YourViewModelClass)DataContext).SearchModeChanged += OnIsSearchModeChanged;
}
private void OnIsSearchModeChanged(object sender, EventArgs e)
{
var searchBox = obj as SearchBox;
searchBox.SearchMode = (Mode)e.NewValue;
}
这样,每次在视图模型中使用ActivateLassSelectedSearchMode方法时,您都会在视图中调用OnIsSearchModeChanged方法。您应该在视图模型中创建一个事件,并从代码中订阅它 在视图模型中:
public event SearchModeAction SearchModeChanged;
public delegate void SearchModeAction(object sender, EventArgs e);
public void SearchModeHasChanged()
{
SearchModeAction Handler = SearchModeChanged;
if (Handler != null)
{
Handler(this, null);
}
}
private void ActivateLastSelectedSearchMode(Mode lastselectedMode)
{
// Sets the last selected mode to the search mode
SearchMode = lastselectedMode;
SearchModeHasChanged()
}
在代码隐藏中:
private void Window_Loaded(object sender, RoutedEventArgs e)
{
((YourViewModelClass)DataContext).SearchModeChanged += OnIsSearchModeChanged;
}
private void OnIsSearchModeChanged(object sender, EventArgs e)
{
var searchBox = obj as SearchBox;
searchBox.SearchMode = (Mode)e.NewValue;
}
这样,每次在视图模型中使用ActivateLassSelectedSearchMode方法时,都会在视图中调用OnIsSearchModeChanged方法。啊..原因是EnumToBooleanConverter 虽然“parameter”和“value”的值相同,但它们的对象类型之间存在差异,因为它们都引用不同的名称空间。因此,我创建了一个名为“Mode”的公共枚举,并确保“Instant”和“Delayed”引用指向同一名称空间
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
{
return false;
}
return value.Equals(parameter); // This always returned false despite the values being the same
}
啊..原因是EnumToBooleanConverter 虽然“parameter”和“value”的值相同,但它们的对象类型之间存在差异,因为它们都引用不同的名称空间。因此,我创建了一个名为“Mode”的公共枚举,并确保“Instant”和“Delayed”引用指向同一名称空间
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null)
{
return false;
}
return value.Equals(parameter); // This always returned false despite the values being the same
}