2014-01-14 6 views
1

Я работаю над этим некоторое время и, похоже, не могу найти никаких хороших ответов на мою проблему. Я использую настраиваемый элемент управления, который имеет настраиваемые свойства зависимостей, и в моем основном приложении я привязываюсь к этим свойствам с помощью моей модели просмотра, которая просматривается через локатор viewmodel с использованием mvvmlight. мой вопрос в том, почему привязка не обновляется и не видна правильно datacontext?Связывание не работает с зависимым свойством пользовательского контроля пользователя

Код:

Пользователь управления Xaml:

<UserControl x:Name="zKeyBoard" 
     x:Class="ZLibrary.ZKeyBoard" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     mc:Ignorable="d" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     d:DesignHeight="768" d:DesignWidth="1024"> 
<Grid> 
    <TextBox TextWrapping="Wrap" Text="{Binding zDisplayText}" /> 
    <Label Content="{Binding zBoxToEdit}"/> 
</Grid> 
</UserControl> 

вещей я судимые Пользователь управления Xaml Уже:

<TextBox TextWrapping="Wrap" Text="{Binding zDisplayText, ElementName=zKeyBoard}" /> 
<Label Content="{Binding zBoxToEdit, ElementName=zKeyBoard}"/> 

пользователя Control C#:

using System.ComponentModel; 

namespace ZLibrary 
{ 

public partial class ZKeyBoard : UserControl, INotifyPropertyChanged 
{ 

    public ZKeyBoard() 
    { 
     InitializeComponent(); 
    } 

public string zBoxToEdit 
    { 
     get { return (string)GetValue(zBoxToEditProperty); } 
     set { SetValue(zBoxToEditProperty, value); } 
    } 

    public static readonly DependencyProperty zBoxToEditProperty = 
     DependencyProperty.Register("zBoxToEdit", typeof(string), typeof(ZKeyBoard), new UIPropertyMetadata("")); 

public string zDisplayText 
    { 
     get { return (string)GetValue(zDisplayTextProperty); } 
     set { SetValue(zDisplayTextProperty, value); } 
    } 

    public static readonly DependencyProperty zDisplayTextProperty = 
     DependencyProperty.Register("zDisplayText", typeof(string), typeof(ZKeyBoard), new UIPropertyMetadata("")); 
} 

} 

Вещи, которые у меня уже есть d в пользовательском управления C#:

public string zBoxToEdit 
    { 
     get; 
     set; 
    } 

public string zDisplayText 
    { 
     get; 
     set; 
    } 

Вот Файлы проекта Если пользователь Control используется:

app.xaml:

<Application x:Class="WpfApplication1.App" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     xmlns:vm="clr-namespace:Sandstorm.ViewModel" 
     mc:Ignorable="d" 
     StartupUri="Main.xaml"> 
<Application.Resources> 
    <ResourceDictionary> 
     <vm:ViewModelLocator x:Key="Locator" d:IsDataSource="True" /> 
    </ResourceDictionary> 
</Application.Resources> 
</Application> 

ViewModel Locator:

using GalaSoft.MvvmLight; 
using GalaSoft.MvvmLight.Ioc; 
using Microsoft.Practices.ServiceLocation; 

namespace Sandstorm.ViewModel 
{ 
class ViewModelLocator 
{ 
    public ViewModelLocator() 
    { 
     ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default); 

     SimpleIoc.Default.Register<KeyBoardViewModel>(() => 
     { 
      return new KeyBoardViewModel(); 
     }); 
    } 

    public KeyBoardViewModel KeyBoardViewModel 
    { 
     get { return ServiceLocator.Current.GetInstance<KeyBoardViewModel>(); } 
    } 

    public static void Cleanup() 
    { 
     // TODO Clear the ViewModels 
    } 
} 

} 

Xaml Пользовательский элемент управления используется в:

<Page x:Name="keyboard_Frame" 
    x:Class="Sandstorm.keyBoard" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
    xmlns:ZControls="clr-namespace:ZLibrary;assembly=ZLibrary" 
    DataContext="{Binding KeyBoardViewModel, Source={StaticResource Locator}}" 
    mc:Ignorable="d" 
    d:DesignHeight="768" d:DesignWidth="1024" 
    ShowsNavigationUI="False" 
Title="KeyBoard"> 
<Grid> 
    <ZControls:ZKeyBoard zBoxToEdit="{Binding boxToEdit}" zDisplayText="{Binding keyboardEntry}" /> 
</Grid> 
</Page> 

Когда этот Xaml запускается так же, как и этот путь Он выдает ошибку в консоли, в которой говорится, что он не может найти свойство привязки либо boxToEdit, либо keyboarEntry, и он возвращает исходное имя ZKeyBoard как место, которое не может быть найдено ... Так что я добавил это:

<ZControls:ZKeyBoard zBoxToEdit="{Binding boxToEdit, RelativeSource={RelativeSource Mode=TemplatedParent}}" zDisplayText="{Binding keyboardEntry, RelativeSource={RelativeSource Mode=TemplatedParent}}" /> 

вызвавших ошибку уйти, который я предполагаю, что имел в виду, что он может найти ViewModel пока еще ничего не произошло.

И, наконец, вид Модель:

using GalaSoft.MvvmLight; 
using GalaSoft.MvvmLight.Command; 
using System.ComponentModel; 

namespace Sandstorm.ViewModel 
{ 

class KeyBoardViewModel : ViewModelBase, INotifyPropertyChanged 
{ 
    private string _keyboardEntry; 
    private string _boxToEdit; 

public KeyBoardViewModel() 
    { 
     _boxToEdit = "yay"; 
    } 

public event PropertyChangedEventHandler PropertyChanged; 

    protected virtual void OnPropertyChanged(string propertyName) 
    { 
     if (this.PropertyChanged != null) 
     { 
      this.PropertyChanged(this, 
       new PropertyChangedEventArgs(propertyName)); 
     } 
    } 

public string keyboardEntry 
    { 
     get { return this._keyboardEntry; } 
     set 
     { 
      if (this._keyboardEntry != value) 
      { 
       this._keyboardEntry = value; 
       this.OnPropertyChanged("keyboardEntry"); 
       Console.Out.WriteLine(this._keyboardEntry); 
      } 
     } 
    } 

    public string boxToEdit 
    { 
     get { return this._boxToEdit; } 
     set 
     { 
      if (this._boxToEdit != value) 
      { 
       this._boxToEdit = value; 
       this.OnPropertyChanged("boxToEdit"); 
       Console.Out.WriteLine(this._boxToEdit); 
      } 
     } 
    } 

} 

} 

Одна вещь, я заметил, что я не могу видеть Console.out.writeline делать что-нибудь для меня означает, что он не ставит вообще. так много больших вопросов, почему это не работает. Любая помощь по этому вопросу будет потрясающей! это, вероятно, что-то маленькое и глупое, но вторая пара глаз на этом, вероятно, заметит его быстрее меня.

+2

Не устанавливайте объект DataContext самостоятельно. Проблема решена. –

+0

ОК, попробовав это сейчас – Keleko

+0

omg спасибо, что-то такое маленькое, но сломал все, я бы никогда этого не пробовал. TY! – Keleko

ответ

4

Простой ответ:

Не устанавливайте DataContext самостоятельно.

Неисправность решена

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