gpt4 book ai didi

silverlight - 将 View 加载到 ContentControl 并通过单击按钮更改其属性

转载 作者:行者123 更新时间:2023-12-03 10:15:25 26 4
gpt4 key购买 nike

我有一个 mvvm(model view viewmodel) silverlight 应用程序,它有几个需要加载到 ContentControls 的 View (我在表达式混合中做了所有)。例如,我不知道该怎么做,通过单击另一个内容控件中的另一个 View 中的按钮,在一个内容控件中加载一个 View (用户控件)。为了更容易理解这个问题,我需要做一些类似的事情:

http://www.codeproject.com/KB/silverlight/BlendableVMCom.aspx

不同之处在于 child1 和 child2 应该通过单击 Call child1 或 call child2 按钮加载到他们自己的内容控件中。

和例子将不胜感激。提前致谢!

最佳答案

这个例子非常简化,但我想你现在如何根据你的应用程序调整它。

主要观点:

<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Border x:Name="commandsView">
<Button Content="Call view 1" Command="{Binding CallView1Command}" HorizontalAlignment="Center" VerticalAlignment="Top" Margin="5" />
</Border>
<Border x:Name="displayedView" Grid.Column="1">
<ContentControl Content="{Binding CurrentView}" />
</Border>
</Grid>

我没有创建单独的 View 作为用户控件,这里只是边框,可以用真实的 View 代替。

后面代码中不同 View 的不同 View 模型:
this.commandsView.DataContext = new CommandsViewModel();
this.displayedView.DataContext = new DisplayedViewModel();

第一个 View 模型包含将消息发送到另一个 View 模型的命令:
public class CommandsViewModel
{
public CommandsViewModel()
{
this.CallView1Command = new RelayCommand(() =>
Messenger.Default.Send<View1Message>(new View1Message()));
}

public RelayCommand CallView1Command { get; set; }

}

public class View1Message : MessageBase
{

}

要使此示例工作,请下载 MVVM Light library .

第二个 View 模型接收消息并为其属性创建一个 View :
public class DisplayedViewModel : ViewModelBase
{
public DisplayedViewModel()
{
Messenger.Default.Register<View1Message>(this, obj =>
this.CurrentView = new TextBlock { Text = "Pressed the button 1 and now here is the view 1" });
}

private object currentView;

public object CurrentView
{
get { return currentView; }
set
{
currentView = value;
RaisePropertyChanged("CurrentView");
}
}
}

同样,可以使用 clr 对象而不是控件并在 xaml 中应用数据模板,但是没有足够的空间来提供所有结果代码。

就是这样,主要思想是某种事件聚合器,即 Messenger在这种特殊情况下的类。

如果没有 MVVM Light,它将需要更多代码:
public partial class MainPage : UserControl
{
public MainPage()
{
InitializeComponent();

var events = new GlobalEvents();
this.commandsView.DataContext = new CommandsViewModel(events);
this.displayedView.DataContext = new DisplayedViewModel(events);
}
}

public class GlobalEvents
{
public event EventHandler View1Event = delegate { };

public void RaiseView1Event()
{
View1Event(this, EventArgs.Empty);
}
}

/// <summary>
/// Commands which call different views
/// </summary>
public class CommandsViewModel
{
public CommandsViewModel(GlobalEvents globalEvents)
{
this.CallView1Command = new DelegateCommand(globalEvents.RaiseView1Event);
}

public DelegateCommand CallView1Command { get; set; }
}

/// <summary>
/// Model where views are changed and then displayed
/// </summary>
public class DisplayedViewModel : INotifyPropertyChanged
{
public DisplayedViewModel(GlobalEvents globalEvents)
{
globalEvents.View1Event += (s,e) =>
this.CurrentView = new TextBlock { Text = "Pressed the button 1 and now here is the view 1" };
}

private object currentView;

public object CurrentView
{
get { return currentView; }
set
{
currentView = value;
RaisePropertyChanged("CurrentView");
}
}


public event PropertyChangedEventHandler PropertyChanged;

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

}

在本例中,您必须更改 DelegateCommand为不同的东西上课。其他代码适用于所有人。

关于silverlight - 将 View 加载到 ContentControl 并通过单击按钮更改其属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5956559/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com