2012-03-05 6 views
0

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

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}" 
+0

попробовать это 'Команда: WindowBehaviors.IsOpen =" {Binding Isopen, Mode = TwoWay} «Возможно, ваше значение привязки неверно. 'o' отображается в нижнем регистре. – ebattulga

+0

Нет, это не проблема. Я не могу связать что-либо перед определением ресурса, например, для заголовка я должен поставить это после определения ресурса:

+0

Isopen - свойство myViewModel? – ebattulga

ответ

0

Спасибо за помощь, я исправил ее, и вот мое решение, Я использовал для использования MVVMToolkit, но теперь я использую MVVMlight и, как вы знаете, в MVVMLight, мы просто определяем ресурсы приложения Once in 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}}" 

и работает perfect.:D

0
public MainWindow() 
      { 
       InitializeComponent(); 

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

      } 
+0

. Спасибо. Попробуем попробовать, но я не хочу писать код! –

+0

он не работает, он должен иметь простое решение. Что не так? –

0

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

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

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

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

+0

спасибо, но я хочу привязываться к свойству окна, а не к сетчатым детям! Что мне писать здесь? !!! '' –

Смежные вопросы