. Я пытаюсь закодировать программу, где, если вы нажмете на элемент списка или кнопку в одном пользовательском контроле, он обновит текстовое поле в другом usercontrol. Кажется, я не могу понять, как правильно работать с зависимостью.Нужна помощь при создании кнопки в одном UserControl. Обновите GUI в другом UserControl, используя «Свойства» в C#
Listbox.xaml
<UserControl x:Class="TestDP3.ListBoxUserControl"
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:local="clr-namespace:TestDP3">
<UserControl.DataContext>
<local:MyViewModel/>
</UserControl.DataContext>
<Grid>
<ListBox x:Name="lstbox" HorizontalAlignment="Left" Height="144" Margin="21,23,0,0" VerticalAlignment="Top" Width="149" SelectionChanged="Selector_OnSelectionChanged"/>
<Button Content="Button" HorizontalAlignment="Left" Margin="105,231,0,0" VerticalAlignment="Top" Width="75" Command="{Binding TestCommand}"/>
<TextBlock HorizontalAlignment="Left" Margin="52,272,0,0" TextWrapping="Wrap" Text="{Binding MyDp.Result}" VerticalAlignment="Top"/>
</Grid>
VnInfo.xaml
<UserControl x:Class="TestDP3.VnInfoUserControl"
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"
d:DesignHeight="300" d:DesignWidth="300"
xmlns:local="clr-namespace:TestDP3">
<UserControl.DataContext>
<local:MyViewModel/>
</UserControl.DataContext>
<Grid>
<TextBlock HorizontalAlignment="Left" Margin="10,102,0,0" TextWrapping="Wrap" Text="DependencyProperty is: " VerticalAlignment="Top"/>
<TextBlock HorizontalAlignment="Left" Margin="159,102,0,0" TextWrapping="Wrap" Text="{Binding MyDp.Result, Mode=TwoWay}" VerticalAlignment="Top"/>
</Grid>
</UserControl>
MyViewModel.cs
public class MyViewModel : INotifyPropertyChanged
{
private MyDP _myDP;
public event PropertyChangedEventHandler PropertyChanged;
public MyViewModel()
{
_myDP = new MyDP();
TestCommand = new MyCommand(SampleMethod);
}
public MyDP MyDp
{
get { return _myDP; }
set
{
_myDP = value;
RaisePropertyChanged("MyDP");
}
}
private void RaisePropertyChanged(string propertyName)
{
PropertyChangedEventHandler handler = this.PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(propertyName));
}
}
public ICommand TestCommand { get; set; }
private int counter = 0;
private int SampleMethod()
{
MyDp.Result = counter++;
return MyDp.Result;
}
}
MyDP.cs
public class MyDP : DependencyObject
{
public int Result
{
get { return (int)GetValue(ResultProperty); }
set { SetValue(ResultProperty, value); }
}
public static readonly DependencyProperty ResultProperty =
DependencyProperty.Register("Result", typeof(int), typeof(MyDP) ,new PropertyMetadata(0)
);
}
Вот ссылка на Visual Studio проекта: https://dl.dropboxusercontent.com/u/22398345/TestDP.zip
Я знаком с WPF и MVVM, но я никогда не играл с настройкой DataContext в xaml. Является в каждом файле xaml, фактически ссылающемся на один и тот же объект, или этот вызов создает все новые объекты? –
Tim
Вы не правы, это невозможно в этом случае, если вы используете инфраструктуру mvvm, попробуйте использовать посланник для отправки событий между моделями просмотра. Вот пример mvvm light messenger: http://stackoverflow.com/questions/16993918/mvvm-light-messenger-sending-and-registering-objects – Younes