C# 使用MVVM的Windows 10应用程序-使用按钮在不同视图/页面上设置另一控件的IsLocked属性

C# 使用MVVM的Windows 10应用程序-使用按钮在不同视图/页面上设置另一控件的IsLocked属性,c#,xaml,mvvm,win-universal-app,C#,Xaml,Mvvm,Win Universal App,我不熟悉Windows10上的XAML和通用应用程序开发。我正在学习MVVM,并想做以下工作: 我有一个名为Shell的视图,其中包含一个SplitView控件。我想在SplitView窗格上使用一个ToggleButton,单击该按钮时,在另一个名为MainPage的视图中设置Pivot控件的IsLocked属性 我的问题是有哪些技术可以做到这一点?要在ViewModels之间进行通信,您应该使用类似MVVM Light Messenger的Messenger 像这样: class ViewM

我不熟悉Windows10上的XAML和通用应用程序开发。我正在学习MVVM,并想做以下工作:

我有一个名为Shell的视图,其中包含一个SplitView控件。我想在SplitView窗格上使用一个ToggleButton,单击该按钮时,在另一个名为MainPage的视图中设置Pivot控件的IsLocked属性


我的问题是有哪些技术可以做到这一点?

要在ViewModels之间进行通信,您应该使用类似MVVM Light Messenger的Messenger

像这样:

class ViewModel1
{
    private void sendMessage()
    {
        Messenger.Default.Send<InputStringMessage>(msg);
    }
}
类视图模型1
{
私有void sendMessage()
{
Messenger.Default.Send(msg);
}
}

类视图模型2
{
公共视图模型2()
{
Messenger.Default.Register(this,(action)=>ReceiveInputMessage(action));
}
受保护的无效接收InputMessage(InputStringMessagemessage)
{
...
}

对ToggleButton的IsChecked属性使用双向数据绑定,并将其绑定到ShellViewModel上名为IsPivotLocked的属性

ToggleButton IsChecked=“{Binding IsPivotLocked,Mode=TwoWay}”

然后在MainPageViewModel中传递对ShellViewModel的引用,并将其作为名为Shell的属性公开。然后进入MainPageView并在Pivot的IsLocked属性上使用单向数据绑定,如下所示:

Pivot IsLocked=“{Binding Shell.IsPivotLocked}”


请注意,IsPivotLocked属性需要调用PropertyChanged事件才能正常工作。

使用新的编译绑定,您可以简单地从pivot将IsLocked属性绑定到从ToggleButton选中的IsChecked属性

必须在您的应用程序资源中声明:

<Application
  x:Class="xbindcontrol.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:xbindcontrol"
  RequestedTheme="Light">

  <Application.Resources>
        <ResourceDictionary>
            <local:NullableBoolToBoolConverter x:Key="NullableBoolToBoolConverter" />
       </ResourceDictionary>
    </Application.Resources>
</Application>

<SplitView DisplayMode="Inline" IsPaneOpen="True">
    <SplitView.Pane>
        <StackPanel>
            <ToggleButton Content="Lock/Unlock" x:Name="toggle" />
        </StackPanel>
    </SplitView.Pane>

    <Pivot x:Name="pivot" IsLocked="{x:Bind toggle.IsChecked, Mode=OneWay, Converter={StaticResource NullableBoolToBoolConverter}}">
    <PivotItem Header="item 1">

        </PivotItem>
        <PivotItem Header="item 2">

        </PivotItem>
    </Pivot>
</SplitView>
public class NullableBoolToBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        var nullableValue = (value as bool?);
        return nullableValue.HasValue && nullableValue.Value;
    }

    public object ConvertBack(object value, Type targetType, object parameter, string language)
    {
        throw new NotImplementedException();
    }
}
<Application
  x:Class="xbindcontrol.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:local="using:xbindcontrol"
  RequestedTheme="Light">

  <Application.Resources>
        <ResourceDictionary>
            <local:NullableBoolToBoolConverter x:Key="NullableBoolToBoolConverter" />
       </ResourceDictionary>
    </Application.Resources>
</Application>