我第一次使用WPF(C#),这是我遇到的第一个“真正的”设计选择。我有一个主窗口,当用户输入一些数据并按下“情节”Button
时,会出现一个新窗口,显示图形。
这个图形窗口我用xaml和代码隐藏文件的组合来定义自己。问题是这个窗口有2个参数是x轴标题和y轴标题。所以,这些应该是制作这个窗口的“参数”。
我对此感到困惑,因为我正在使用MVVM,我为名为GraphWindowPresenter
的窗口创建了一个“ViewModel”,为名为GraphWindowView
的类创建了一个“View”。
首先,我尝试在xAxis
中拥有yAxis
属性和GraphWindowPresenter
属性,但这不起作用,因为我需要在构造时“绑定”这些值GraphWindowView
。此外,这种方法要求我的GraphWindowPresenter
采用xAxis
参数和yAxis
参数,这也是一个问题,因为我只是在{{1}的xaml中创建了一个类的实例}}。
我正在考虑一种可能的解决方法,我可以让GraphWindowView
获取GraphWindowView
和xAxis
参数,但这不会违反MVVM吗?我宁愿不这样做。
注意:这与此帖MVVM: Binding a ViewModel which takes constructor args to a UserControl类似。但在我的场景中,由于我有一个父窗口和一个弹出的子窗口,因此很棘手。
问题:此设计问题的最佳方法是什么?关于这种情况的“最佳实践”是什么?
可能答案:
这是您描述的依赖项属性的正确用法吗?这是一个“干净”的解决方案吗?
yAxis
在我的private void doGraph()
{
if (log == null) // if a log is not loaded
{
MessageBoxResult mbr = MessageBox.Show("A log file must be " +
"loaded before plotting.",
"Warning",
MessageBoxButton.OK,
MessageBoxImage.Exclamation);
return;
}
// NOW MUST PRESENT GRAPH WINDOW
GraphWindowView gwv = new GraphWindowView();
gwv.xAxis = X_AXIS_VALUE:
gwv.yAxis = Y_AXIS_VALUE;
gwv.Show();
}
课程中,我有代码:
GraphWindowView
答案 0 :(得分:0)
您可以使用userSetting properties
我的应用程序有一个相同的场景,我有mainWindow接受HostAddress,Port值,当我点击连接时它将使用另一个窗口,所以我使用userSetting属性。我也在使用下面的MVVM模式检查代码片段
XAML:
<TextBox Width="120" Canvas.Left="132" Canvas.Top="16" Text="{Binding Path=Server,Mode=TwoWay}"/>
<TextBox Width="120" Canvas.Left="132" Canvas.Top="42" Text="{Binding Path=DisplayPort,Mode=TwoWay}"/>
<TextBox Width="120" Canvas.Left="132" Canvas.Top="69" Text="{Binding Path=CtrlPort,Mode=TwoWay}"/>
<Button Content="Launch" Name="btnLaunch" Command="{Binding Path=appSetting}" Canvas.Left="132" Canvas.Top="100" Width="120" Height="51" Click="btnLaunch_Click" />
VIEWMODE:
public class SettingsViewModel : ViewModelBase
{
private Settings _settings { get; set; }
public SettingsViewModel()
{
appSetting = new RelayCommand(this.AppSettingsCommand);
_settings = ApplicationTest.Properties.Settings.Default;
}
private string _server = Settings.Default.Server;
public string Server
{
get { return this._server; }
set
{
if (this._server != value)
{
this._server = value;
OnPropertyChanged("Server");
}
}
}
private string _displayPort = Settings.Default.DisplayPort;
public string DisplayPort
{
get { return this._displayPort; }
set
{
if (this._displayPort != value)
{
this._displayPort = value;
OnPropertyChanged("DisplayPort");
}
}
}
private string _ctrlPort = Settings.Default.CtrlPort;
public string CtrlPort
{
get { return this._ctrlPort; }
set
{
if (this._ctrlPort != value)
{
this._ctrlPort = value;
OnPropertyChanged("DisplayPort");
}
}
}
public RelayCommand appSetting
{
get;
set;
}
private void AppSettingsCommand()
{
this._settings.Server = this.Server;
this._settings.DisplayPort = this.DisplayPort;
this._settings.CtrlPort = this.CtrlPort;
this._settings.Save();
}