2011-09-09 75 views
3

我使用Window.xaml.cs構造函數(DataContext = WindowVM)中的DataContext將我的wpf窗口綁定到應用程序層類(WindowVM.cs)。但是,一個控件(btnAdd)我想要綁定到Window.xaml.cs屬性。因此,在Window.xaml.cs構造函數中,我添加了this.btnAdd.DataContext。這是Window.xaml.cs構造和財產,我想結合ButtonbtnAdd將一個控件綁定到另一個的DataContext

public Window() 
    { 
     InitializeComponent(); 
     DataContext = WindowVM; 
     this.btnAdd.DataContext = this; 
    } 

    public RelayCommand Add 
    { 
     get 
     { 
      return _add == null ? _add= new RelayCommand(AddPP, CanAddPP) : _add; 
     } 
     set 
     { 
      OnPropertyChanged("Add"); 
     } 
    } 

的XAML看起來像這樣(類PP是WindowVM屬性):

<TextBox Name="txtName" Text="{Binding PP.Name, ValidatesOnDataErrors=true, UpdateSourceTrigger=PropertyChanged}" /> 
<TextBox Name="txtSurname" Text="{Binding PP.Surname, ValidatesOnDataErrors=true, UpdateSourceTrigger=PropertyChanged}" /> 
<Button Command="{Binding Add}" Content="Add" ... /> 

而且 - 一切正常,但控制檯輸出:

BindingExpression path error: 'Add' property not found on 'object' ''WindowVM'... 

在接下來的調用中沒有任何控制檯輸出錯誤的屬性添加。

現在我有點困惑,因爲這個錯誤。這是因爲第一個DataContext(對WindowVM)的錯誤,因爲沒有屬性添加,但行this.btnAdd.DataContext屬性添加被發現,這是它的工作原因?

+0

那麼,爲什麼你使用MVVM(或類似的),如果你不打算在ViewModel命令? ViewModel應該是Command的位置。後面的窗口代碼應該真的有零碼。 –

+0

我把命令放在ViewModel中,但有問題,因爲我需要關閉窗口。此綁定工作:{Binding ElementName = MyUsersView,Path = Add}。但是,我會嘗試這個:http://blog.excastle.com/2010/07/25/mvvm-and-dialogresult-with-no-code-behind/然後把命令放在ViewModel中。 – davor

回答

0

當您設置DataContext屬性時,您的窗口重置它的子控件的綁定。即使你的按鈕綁定。 在這一點(在「button.DataContext = this」之前評估)在WindowVM中搜索「Add」。在此之後,您將Window類設置爲按鈕DC,並且一切正常。

爲了避免初始誤差,交換從這個

public Window() 
{ 
    InitializeComponent(); 
    DataContext = WindowVM; 
    this.btnAdd.DataContext = this; 
} 

兩行此

public Window() 
{ 
    InitializeComponent(); 
    this.btnAdd.DataContext = this; 
    DataContext = WindowVM; 
} 
+0

現在如何設置按鍵綁定到這個按鈕? 不起作用 – davor

+0

您的KeyBinding看起來不錯,但您仍然需要使用CommandBinding來捕獲它 其中「CommandExecuted_Handler」是它的事件處理程序。 你可以找到Documentation [here](http://msdn.microsoft.com/de-de/library/system.windows.input.commandbinding.executed.aspx) – NikoR

1

只需設置ButtonDataContext在XAML使用RelativeSource

<Button Command="{Binding Add}" Content="Add" DataContext="{Binding Add, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type Window}}}" /> 
1

我有這個問題,我知道這是一個古老的帖子但我認爲這可能會幫助未來發生此事的人。

我所做的是聲明的ViewModels作爲資源

<Page.Resources> 
    <local:LocationListViewModel x:Key="LocationList" /> 
    <local:LocationNewViewModel x:Key="NewLocation" /> 
    <code:BinaryImageConverter x:Key="imgConverter" /> 
</Page.Resources> 

然後不斷控制,我想可以與所述視圖模型我添加到了他們的datacontext

<TabItem x:Name="tabSettingsLocations" x:Uid="tabSettingsLocations" 
       Header="Locations" 
       DataContext="{StaticResource ResourceKey=LocationList}">.... 

<TabItem x:Name="tbSettingsLocationsAdd" x:Uid="tbSettingsLocationsAdd" 
     Header="Add New" 
     DataContext="{StaticResource ResourceKey=NewLocation}">.... 

<Image x:Name="imgSettingsLocationMapNew" x:Uid="imgSettingsLocationMapNew" 
     Source="{Binding Map, Converter={StaticResource imgConverter}, 
     Mode=TwoWay}" 
     DataContext="{StaticResource ResourceKey=NewLocation}" /> 

所以在我的例子上述關聯我有列表視圖綁定到列表viewmodel,併爲我的新條目創建一個新的單一位置。您會注意到,通過將其創建爲資源,我可以將tabitem和圖像(不是選項卡項的子項)綁定到新位置viewmodel。

我對addnew位置的命令位於新位置viewmodel中。

<TabItem x:Name="tbSettingsLocationsAdd" x:Uid="tbSettingsLocationsAdd" 
     Header="Add New" 
     DataContext="{StaticResource ResourceKey=NewLocation}">.... 

    <Button x:Name="btnSettingsLocationSaveAdd" x:Uid="btnSettingsLocationSaveAdd" Content="Submit" Margin="0,80,10,0" 
     VerticalAlignment="Top" Style="{DynamicResource ButtonStyle}" HorizontalAlignment="Right" Width="75" 
     Command="{Binding AddCommand}" />..... 

這是我綁定到新位置viewmodel的tabitem的子項。

我希望有幫助。

相關問題