this question (click me!)のおかげで、WebBrowser
という私のViewModelに正しくバインドされたSource
というプロパティがあります。私の戻る]ボタンや[進む]ボタンのIsEnabled
プロパティが正しくWebBrowser
のCanGoBack
とCanGoForward
プロパティにバインドするには、GetWPFでWebブラウザーコントロールを使用するMVVMに優しい方法はありますか?
- :
今私は2つの目標を達成したいと思います。
- と
GoBack()
のメソッドをコードビハインドに頼らずに呼び出す方法と、ViewModelがWebBrowser
について知る必要がない方法を解説します。
私は、現時点では、以下の(非稼働)XAMLのマークアップを持っている:
<WebBrowser
x:Name="_instructionsWebBrowser"
x:FieldModifier="private"
clwm:WebBrowserUtility.AttachedSource="{Binding InstructionsSource}" />
<Button
Style="{StaticResource Button_Style}"
Grid.Column="2"
IsEnabled="{Binding ElementName=_instructionsWebBrowser, Path=CanGoBack}"
Command="{Binding GoBackCommand}"
Content="< Back" />
<Button
Style="{StaticResource Button_Style}"
Grid.Column="4"
IsEnabled="{Binding ElementName=_instructionsWebBrowser, Path=CanGoForward}"
Command="{Binding GoForwardCommand}"
Content="Forward >" />
私は問題がCanGoBack
とCanGoForward
は、依存関係プロパティではありません(と実装していないということであるかなり確信していますINotifyChanged
)、私はそれを回避する方法についてはあまりよく分かりません。
質問:
(私は
Source
で行ったように)添付プロパティをフックアップまたはCanGoBack
とCanGoForward
バインディングが仕事を得るために似たような方法はありますか?GoBackCommand
とGoForwardCommand
は、コードビハインドとViewModelから独立しているため、マークアップで宣言できますか?
@Botz、ありがとうございます。実際に 'FrameworkElement'クラスをどのように設定するかについては、少し曇っています。フィールド 'webBrowser'を持っていると仮定しますが、実際にそれをどのように表示させるのですか?私は 'UserControl'をビルドし、実際に' WebBrowser'を 'Grid'に配置する必要があると考えていました。あなたは 'FrameworkElement'を継承するクラスでこれをどのように扱いますか?ありがとう。 – devuxer
実際にはUserControlは必要ありませんが、正しく設定している限り、FrameworkElementは問題ありません。私の実装は最良ではないかもしれませんが、見たい場合はコントロールはhttp://pastebin.com/m492dbd3fにあります(BrowserViewModelについて不思議なら、コントロールのプロパティが実際にバインドされているViewModelですあなたが既に独自のViewModelを持っていると確信しています) – Botz3000
// btw FrameworkElementから派生している場合は、AddVisualChildとAddLogicalChildを呼び出して実際にWebBrowserやその他のものを呼び出すことができます – Botz3000