トップ回答者
WPF MultiValueConverterの戻り値をコントロールに返す方法

質問
-
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
回答
-
こんにちは。
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>
- 編集済み いわさ Tak1waMVP, Moderator 2017年6月23日 9:41
- 回答としてマーク huahi11112 2017年6月23日 11:51
すべての返信
-
<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を詳細に掲載していただけると助かります。
よろしくお願い致します。 -
こんにちは。
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>
- 編集済み いわさ Tak1waMVP, Moderator 2017年6月23日 9:41
- 回答としてマーク huahi11112 2017年6月23日 11:51
-
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>