如何在WPF(C#)中创建一个带参数的窗口?

时间:2014-06-05 19:16:55

标签: c# wpf xaml mvvm

我第一次使用WPF(C#),这是我遇到的第一个“真正的”设计选择。我有一个主窗口,当用户输入一些数据并按下“情节”Button时,会出现一个新窗口,显示图形。

这个图形窗口我用xaml和代码隐藏文件的组合来定义自己。问题是这个窗口有2个参数是x轴标题和y轴标题。所以,这些应该是制作这个窗口的“参数”。

我对此感到困惑,因为我正在使用MVVM,我为名为GraphWindowPresenter的窗口创建了一个“ViewModel”,为名为GraphWindowView的类创建了一个“View”。

首先,我尝试在xAxis中拥有yAxis属性和GraphWindowPresenter属性,但这不起作用,因为我需要在构造时“绑定”这些值GraphWindowView。此外,这种方法要求我的GraphWindowPresenter采用xAxis参数和yAxis参数,这也是一个问题,因为我只是在{{1}的xaml中创建了一个类的实例}}。

我正在考虑一种可能的解决方法,我可以让GraphWindowView获取GraphWindowViewxAxis参数,但这不会违反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

1 个答案:

答案 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();
    }