Как привязать свойство зависимости WPF к окну? - PullRequest
0 голосов
/ 05 марта 2012

я создаю свойство зависимости, чтобы закрыть представление из модели представления,

DependencyProperty:

  public static class WindowBehaviors 
  {      
     public static readonly DependencyProperty IsOpenProperty =
              DependencyProperty.RegisterAttached("IsOpen"
             , typeof(bool),
             typeof(WindowBehaviors),
             new UIPropertyMetadata(false, IsOpenChanged));

    private static void IsOpenChanged(DependencyObject   obj,DependencyPropertyChangedEventArgs args)
    {
        Window window = Window.GetWindow(obj);

        if (window != null && ((bool)args.NewValue))
            window.Close();
    }


    public static bool GetIsOpen(Window target)
    {
        return (bool)target.GetValue(IsOpenProperty);
    }

    public static void SetIsOpen(Window target, bool value)
    {
        target.SetValue(IsOpenProperty, value);
    }
}

и используйте его в моем xaml так:

<window
...
Command:WindowBehaviors.IsOpen="True">

это работает нормально, но когда я хочу привязать его к свойству в viewModel, это не работает, и я думаю, это не работает, потому что я определил ресурс позже в xaml.

в xaml:

 <Window.Resources>
     <VVM:myVieModel x:Key="myVieModel"/>
 </Window.Resources>

и я не знаю, что мне делать, куда мне положить это:

Command:WindowBehaviors.IsOpen="{binding Isopen}"

Ответы [ 3 ]

0 голосов
/ 06 марта 2012

Вам необходимо связать контекст данных для области, в которой находится ваша привязка. Обычно это довольно высоко в вашем XAML, обычно это первый элемент в вашей форме или элементе управления.

В вашем случае контекст данных, являющийся статическим ресурсом, должен работать следующим образом:

<grid DataContext="{StaticResource myVieModel}">
    <!-- the code with the binding goß into here -->
</grid>

На самом деле это то же самое, что предлагает ebattulga , только путь XAML (без кода).

0 голосов
/ 06 марта 2012

Спасибо за вашу помощь, я исправил это, и вот мое решение, я использовал MVVMToolkit, но теперь я использую MVVMlight и, как вы знаете, в MVVMLight, мы просто определяем ресурсы приложения. Как только в App.xaml.so мы можемпросто свяжите все свойства окна, надеюсь, это поможет некоторым людям, у которых есть такая же проблема !!

app.xaml

  <Application.Resources>
    <!--Global View Model Locator-->
    <vm:ViewModelLocator x:Key="Locator"
                         d:IsDataSource="True" />
  </Application.Resources>

и в окне (просмотр)

DataContext="{Binding DefaultSpecItemVM, Source={StaticResource Locator}}"

и он отлично работает.

0 голосов
/ 05 марта 2012
    public MainWindow()
            {
                InitializeComponent();

// DO THIS
                this.DataContext = Resources["myVieModel"];

            }
...