かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Liver 3.0.3 をリリースしました。Prism + Livet (一部) のようなシナリオをサポート

リリースしました。リリースノートは以下になります。

github.com

ポイント

パッケージを分割しました。

今まで

LivetCask

全部入りパッケージ

LivetExtensions

フォルダーダイアログ

今回

LivetCask

Livet とは切っても切れないクラス群(ViewModel、Messenger 関連、コレクション)と、以下の各種パッケージへの依存関係。

LivetCask.Behaviors

Livet の便利 Behavior。バインドできないプロパティをバインドするようなものや LivetCallMethodAction、DataContextDisposeAction、WindowCloseCancelBehavior など

LivetCask.Converters

WPF 関連の enum と bool を相互変換するコンバーター群

LivetCask.EventListener

PropertyChangedListener や CollectionChangedEventListener などのイベントハンドリング系クラス

LivetExtensions

フォルダーダイアログ

出来るようになること

Prism + LivetCask.Behaviors などのパッケージの組み合わせ

例えば Prism のプロジェクトに Livet.Converters パッケージと Livet.Behaviors パッケージを追加して以下のような感じに ViewModel をします。

using Prism.Mvvm;

namespace HelloWorld.ViewModels
{
    public class ViewAViewModel : BindableBase
    {
        private string _message;
        public string Message
        {
            get { return _message; }
            set { SetProperty(ref _message, value); }
        }

        private bool _status;
        public bool Status
        {
            get { return _status; }
            set { SetProperty(ref _status, value); }
        }

        public ViewAViewModel()
        {
            Message = "View A from your Prism Module";
        }

        public void Switch()
        {
            Status = !Status;
        }
    }
}

そして XAML で Livet の機能を使います。

<UserControl x:Class="HelloWorld.Views.ViewA"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:HelloWorld.Views"
             xmlns:behaviors="http://schemas.microsoft.com/xaml/behaviors"
             xmlns:l="http://schemas.livet-mvvm.net/2011/wpf"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300"
             xmlns:prism="http://prismlibrary.com/"
             prism:ViewModelLocator.AutoWireViewModel="True" >
    <UserControl.Resources>
        <l:VisibilityAndBooleanConverter x:Key="VisibilityAndBooleanConverter" ConvertWhenFalse="Collapsed" />
    </UserControl.Resources>
    <StackPanel>
        <TextBlock Text="{Binding Message}"
                       HorizontalAlignment="Center" />

        <Button Content="Switch">
            <behaviors:Interaction.Triggers>
                <behaviors:EventTrigger EventName="Click">
                    <l:LivetCallMethodAction MethodTarget="{Binding}"
                                         MethodName="Switch" />
                </behaviors:EventTrigger>
            </behaviors:Interaction.Triggers>
        </Button>
        <Border Background="Red" Width="100" Height="100" Visibility="{Binding Status, Converter={StaticResource VisibilityAndBooleanConverter}}"/>
    </StackPanel>
</UserControl>

LivetCallMethodActionVisibilityAndBooleanConverter を使ってます。 こんな感じで動いてます。

f:id:okazuki:20190928123332g:plain

まとめ

Converter とか Behavior とか Listener 系は Livet じゃないプロジェクトでも、あると便利ですので是非使ってみてね!