2013-11-14 2 views
0

Я создал UserControl, который имеет свойство HeroДоступ к UserControl свойство от другого UserControl

public partial class UcHeros : UserControl 
{ 
    public UcHeros() 
    { 
     InitializeComponent(); 
     Hero = "Spiderman"; 
    } 

    public static readonly DependencyProperty HeroProperty = DependencyProperty.Register("Hero", typeof(string), typeof(UcHeros), new PropertyMetadata(null)); 

    public string Hero 
    { 
     get { return (string)GetValue(HeroProperty); } 
     set { SetValue(HeroProperty, value); } 
    } 
} 

Я использую этот UserControl внутри окна, как это:

<Window x:Class="WpfApplication1.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:wpfApplication1="clr-namespace:WpfApplication1" 
     DataContext="{Binding RelativeSource={RelativeSource Self}}" 
     Title="MainWindow" Height="350" Width="525"> 
    <Grid> 
     <StackPanel> 
      <wpfApplication1:UcHeros x:Name="Superhero" />  
      <Button Click="OnClick">Click</Button> 
     </StackPanel> 
    </Grid> 
</Window> 

Теперь, чтобы получить значение Героя Я использую это:

public partial class MainWindow : Window 
{ 
    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    public static readonly DependencyProperty HumanProperty = DependencyProperty.Register("Human", typeof(string), typeof(MainWindow), new PropertyMetadata(null)); 

    public string Human 
    { 
     get { return (string)GetValue(HumanProperty); } 
     set { SetValue(HumanProperty, value); } 
    } 

    private void OnClick(object sender, RoutedEventArgs e) 
    { 
     Debug.WriteLine(Superhero.Hero); 
    } 
} 

Я могу получить доступ к Hero потому что я дал имя этому UserControl в своем объявлении XAML x:Name="Superhero", но как я могу получить доступ к этому значению, если я удалю свойство Name?

Я имею в виду: как я могу сохранить значение Hero в значении Human с использованием своего рода привязки!

+0

Это не MVVM. – MoonKnight

+0

Да это MVVM sir, а событие Click - это всего лишь образец теста. Вместо этого я мог бы использовать ICommand. –

+0

Нет, это не так. Вы используете обработчик событий и помещаете это в код позади. Это нарушает предполагаемый шаблон MVVM. – MoonKnight

ответ

2

Просто Bind ваш Human собственности на Hero собственности на свой контроль:

<wpfApplication1:UcHeros Hero="{Binding Human, Mode=OneWayToSource}" /> 

Попробуйте использовать OneWayToSource Binding, если вы просто хотите, чтобы прочитать значение и не обновлять его.


UPDATE >>>

Как предложено @Killercam, попробуйте установить значение по умолчанию для вашего имущества в декларации вместо конструктора:

public static readonly DependencyProperty HeroProperty = DependencyProperty. 
    Register("Hero", typeof(string), typeof(UcHeros), 
    new PropertyMetadata("Spiderman")); 

Если это все еще не работает , тогда у вас есть что-то еще.

+0

Я уже пробовал, что , но это дает мне NullReferenceException? –

+0

Какой элемент 'null'? Где вы объявили свою «дополнительную» собственность? Пожалуйста, покажите свой XAML 'UserControl'. – Sheridan

+0

В моем 'UcHeros' нет кода XAML, и Human уже был объявлен в моем коде за« MainWindow ». Оба являются Null, потому что, когда вы выполняете 'Hero = {{Binding Human}, свойство Героя связывается с человеком, которое является нулевым! –

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