none
WPF MultiValueConverterの戻り値をコントロールに返す方法 RRS feed

  • 質問


  • 2つのButton(b1,b2)のいずれかのIsEnabledがTRUEになった時に、Button(b3)のIsEnabledをTRUEにしたいと思っています。

    下の様なサンプルコードを動作させることはできましたが、 Public Function Convertの戻り値(Boolean)を使ってButton(b3)のIsEnabledをコントロールする方法がわかりません。
    XAMLのどこを修正すれば良いのか、教えて下さい。


    ’XAML
    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:_0622"
        Title="MainWindow" Height="133" Width="365">
          
        <Window.Resources>
            <l:MultiText x:Key="vConv" />
        </Window.Resources>

        <Grid Height="195" Width="358">

            <Button Content="b1" Height="28" HorizontalAlignment="Left" Margin="36,22,0,0" Name="b1" VerticalAlignment="Top" Width="75" IsEnabled="False" />
            <Button Content="b2" Height="28" HorizontalAlignment="Left" Margin="36,56,0,0" Name="b2" VerticalAlignment="Top" Width="75" IsEnabled="False" />
            
            <Button Content="b3" Command="{Binding Command}" Margin="167,36,76,132" Name="b3">
                <Button.CommandParameter>
                    <MultiBinding Converter="{StaticResource vConv}">
                        <MultiBinding.Bindings>
                            <Binding ElementName="b1" Path="IsEnabled" />
                            <Binding ElementName="b2" Path="IsEnabled" />
                        </MultiBinding.Bindings>
                    </MultiBinding>
                </Button.CommandParameter>
            </Button>
        
        </Grid>
    </Window>


    'コード
    Imports System.Windows.Data

    Class MainWindow

    End Class


    Public Class MultiText
        Implements IMultiValueConverter

        Public Function Convert(values() As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IMultiValueConverter.Convert

            Dim b As Boolean = False
            Debug.Print(values(0)) 'ボタンb1.IsEnabled
            Debug.Print(values(1)) 'ボタンb2.IsEnabled

            If values(0) = True Or values(1) = True Then
                b = True
            End If

            Return b
        End Function

        Public Function ConvertBack(value As Object, targetTypes() As Type, parameter As Object, culture As Globalization.CultureInfo) As Object() Implements IMultiValueConverter.ConvertBack
            Throw New NotImplementedException()
        End Function
    End Class
    2017年6月22日 6:52

回答

  • こんにちは。

    Hongliangさんが仰っているようにIsEnabledにMultiBindingを設定すれば動くと思いますが、
    CommandParameterを何に使っているのかわかりませんが、削除してみては。

    <Grid>
    
        <Button Content="b1" Height="28" HorizontalAlignment="Left" Margin="36,22,0,0" Name="b1" VerticalAlignment="Top" Width="75" IsEnabled="True" />
        <Button Content="b2" Height="28" HorizontalAlignment="Left" Margin="36,56,0,0" Name="b2" VerticalAlignment="Top" Width="75" IsEnabled="False" />
    
        <Button Content="b3" Command="{Binding Command}" Margin="167,36,76,132" Name="b3">
            <Button.IsEnabled>
                <MultiBinding Converter="{StaticResource vConv}">
                    <MultiBinding.Bindings>
                        <Binding ElementName="b1" Path="IsEnabled" />
                        <Binding ElementName="b2" Path="IsEnabled" />
                    </MultiBinding.Bindings>
                </MultiBinding>
            </Button.IsEnabled>
        </Button>
    </Grid>
    


    2017年6月23日 9:40
    モデレータ

すべての返信

  • んーと、Button3のIsEnabledにBindingすればいいんでは。

    <Button ...>
      <Button.IsEnabled>
        <MultiBinding ...>
    2017年6月22日 7:25
  • <Button.IsEnabled>
     <MultiBinding Converter="{StaticResource vConv}"> .....
    </Button.IsEnabled>

    <Button.IsEnabled>
      <Button.CommandParameter> ......
    </Button.IsEnabled>

    上のどちらにしても次のようなエラーが出ます。(こちらでは質問以前に動かないことを確認済みなのですが。)
    ビルドメニューでクリーンとリビルドを実行してもエラーが消えません。


    エラー    1    タグ 'Button.CommandParameter' は、XML 名前空間 'http://schemas.microsoft.com/winfx/2006/xaml/presentation' にありません。 行 18 位置 18.    C:\Users\xxxx\Documents\Visual Studio 2010\Projects\0622\0622\MainWindow.xaml    18    18    0622

    エラー    2    アタッチ可能なプロパティ 'CommandParameter' が、型 'Button' に見つかりませんでした。    C:\Users\xxxx\Documents\Visual Studio 2010\Projects\0622\0622\MainWindow.xaml    18    18    0622


    動作するXAMLを詳細に掲載していただけると助かります。
    よろしくお願い致します。
    2017年6月23日 9:00
  • こんにちは。

    Hongliangさんが仰っているようにIsEnabledにMultiBindingを設定すれば動くと思いますが、
    CommandParameterを何に使っているのかわかりませんが、削除してみては。

    <Grid>
    
        <Button Content="b1" Height="28" HorizontalAlignment="Left" Margin="36,22,0,0" Name="b1" VerticalAlignment="Top" Width="75" IsEnabled="True" />
        <Button Content="b2" Height="28" HorizontalAlignment="Left" Margin="36,56,0,0" Name="b2" VerticalAlignment="Top" Width="75" IsEnabled="False" />
    
        <Button Content="b3" Command="{Binding Command}" Margin="167,36,76,132" Name="b3">
            <Button.IsEnabled>
                <MultiBinding Converter="{StaticResource vConv}">
                    <MultiBinding.Bindings>
                        <Binding ElementName="b1" Path="IsEnabled" />
                        <Binding ElementName="b2" Path="IsEnabled" />
                    </MultiBinding.Bindings>
                </MultiBinding>
            </Button.IsEnabled>
        </Button>
    </Grid>
    


    2017年6月23日 9:40
    モデレータ
  • 詳細にと言われても、私が先のレスで書いた以上のは書きようもないんですが…。huahi11112さんのはじめの投稿にあるCommandParameterをIsEnabledに変更するだけですし。つまり、

    <Button.IsEnabled>
      <MultiBinding Converter="{StaticResource vConv}"> .....
    </Button.IsEnabled>

    これで全く問題ないはずです。

    それでもやはりエラーになるのであれば、一度そのエラーになるというXAMLの全体を提示してみて下さい。

    2017年6月23日 9:52
  • CommandParameterをIsEnabledに変更するだけですし

    ↑これを初めにおっしゃっていただければ、悩まなくて済んだんですけど。

    こういうXAMLを書いていて、どうしても動かないので質問させていただいた次第です。

    <Window x:Class="MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:l="clr-namespace:_0623"
        Title="MainWindow" Height="133" Width="365">

        <Window.Resources>
            <l:MultiText x:Key="vConv" />
        </Window.Resources>

        <Grid Height="195" Width="358">

            <Button Content="b1" Height="28" HorizontalAlignment="Left" Margin="36,22,0,0" Name="b1" VerticalAlignment="Top" Width="75" IsEnabled="False" />
            <Button Content="b2" Height="28" HorizontalAlignment="Left" Margin="36,56,0,0" Name="b2" VerticalAlignment="Top" Width="75" IsEnabled="False" />

            <Button Content="b3" Command="{Binding Command}" Margin="167,36,76,132" Name="b3">
                <Button.CommandParameter>
                    <Button.IsEnabled>
                    <MultiBinding Converter="{StaticResource vConv}">
                        <MultiBinding.Bindings>
                            <Binding ElementName="b1" Path="IsEnabled" />
                            <Binding ElementName="b2" Path="IsEnabled" />
                        </MultiBinding.Bindings>
                    </MultiBinding>
                    </Button.IsEnabled>
                </Button.CommandParameter>
            </Button>

        </Grid>
    </Window>

    2017年6月23日 11:43
  • <Button.CommandParameter>は、WEBサイトでやっと見つけたサンプルコードがこうなっていたので、何も知らずそのまま流用しただけです。

    教えていただいたサンプルコードで、動作が確認できました。

    御回答ありがとうございました。

    2017年6月23日 11:54