Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xaml ViewModel中的值发生更改时,在回调期间不会触发PropertyChangedCallback_Xaml_Mvvm_Data Binding_Dependency Properties_Caliburn.micro - Fatal编程技术网

Xaml ViewModel中的值发生更改时,在回调期间不会触发PropertyChangedCallback

Xaml 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}}" >

我有一个使用SearchBox用户控件的视图,SearchBox有两个单选按钮来选择搜索模式-即时和延迟。我已经将searchmodes绑定到SearchMode属性,并且为搜索模式创建了一个自定义依赖项属性

看法

SearchBox.xaml

<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
        }