2017-06-12 119 views
0

我想实现一个对话框来询问用户输入。我创建了一个用户控件并将数据上下文绑定到ViewModel。我要求用户从列表中选择一个项目。我想将选择传递回主程序。来自用户控制对话框的返回值

try 
{ 
    var ins = from Instrument in InstrumentList where Instrument.Comport == result.Comport select Instrument; 
    result.OperatorName = ins.FirstOrDefault().OperatorName; 
    result.OperatorID = ins.FirstOrDefault().OperatorID; 
} 
catch (Exception) 
{ 
    //Open a control to prompt for instrument. 
    Window window = new Window 
    { 
     Title = "Associate Com Port", 
     Content = new MyDialogView(), 
     SizeToContent = SizeToContent.WidthAndHeight, 
     ResizeMode = ResizeMode.NoResize 
    }; 
    window.ShowDialog(); 
    //var inst= ValueFromDialogBox 
    //WriteInstrumentToConfigFile(inst); 
    //Set proper Instrument/Comport pair 
    GetAdditionalData(result); 
} 

所以我需要的是ValueFromDialogBox。我不介意能够获得多个价值。如果我可以传回一个对象,那么我可以做任何我想做的事情。

这里是XAMLfor对话框(MyDialogView)

<UserControl.DataContext> 
    <vm:MyDialogViewModel/> 
</UserControl.DataContext>  

<UserControl.Resources> 
    <ResourceDictionary Source="./MainWindowResources.xaml" /> 
</UserControl.Resources> 

<Grid> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition Width="3*"/> 
     <ColumnDefinition Width="*"/> 
    </Grid.ColumnDefinitions> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto"/> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 

    <TextBlock Grid.Column="0" 
       Grid.ColumnSpan="2" 
       Grid.Row="0" 
       Style="{StaticResource textStyle}" HorizontalAlignment="Center" 
       Background="AliceBlue"> 
     <Run Text="What instrument are you using?" /> 
    </TextBlock> 

    <TextBlock Grid.Column="0" 
       Grid.Row="1" 
       Style="{StaticResource textStyle}" 
       VerticalAlignment="Center" 
       Background="AliceBlue"> 
     <Run Text="Select the Instrument number from the list."/> 
    </TextBlock> 

    <ListBox Grid.Column="1" 
      Grid.Row="1" 
      SelectedItem="{Binding InstrumentSelected}" 
      ItemsSource="{Binding ListOfInstruments}"/> 
    </Grid> 

这里是视图模型(MyDialogViewModel)

public class MyDialogViewModel : ViewModelBase 
{ 
    #region Fields 
    string prompt; 
    string comResponse; 
    string comport; 
    private string selectedInstrument; 
    private ObservableCollection<string> listOfInstruments; 

    #endregion 

    #region Properties 

    public string Prompt 
    { 
     get { return prompt; } 
     set 
     { 
      prompt = value; 
      RaisePropertyChanged(); 

     } 
    } 

    public string ComResponse 
    { 
     get { return comResponse; } 
     set 
     { 
      comResponse = value; 
      RaisePropertyChanged(); 

     } 
    } 

    public string ComPort 
    { 
     get { return comport; } 
     set 
     { 
      comport = value; 
      RaisePropertyChanged(); 
     } 
    } 

    public string InstrumentSelected 
    { 
     get { return selectedInstrument; } 

     set 
     { 
      if (value == selectedInstrument) 
       return; 
      selectedInstrument = value; 

      base.RaisePropertyChanged(); 
     } 
    } 

    public ObservableCollection<string> ListOfInstruments 
    { 
     get { return listOfInstruments; } 
     set 
     { 
      listOfInstruments = value; 
      RaisePropertyChanged(); 

     } 
    } 
    #endregion 

    #region Commands 


    #endregion 

    #region Methods 



    #endregion 

    #region Constructors 

    public MyDialogViewModel() 
    { 
     listOfInstruments = new ObservableCollection<string>{ 
      "Instrument 1", "Instrument 2", "Instrument 3", "Instrument 4" 
     }; 
    } 

    public MyDialogViewModel(ref MainWindowViewModel mwvm) 
    { 
     listOfInstruments = new ObservableCollection<string>{ 
      "Instrument 1", "Instrument 2", "Instrument 3", "Instrument 4" 
     }; 
    } 
    #endregion 
} 
+0

如果您希望我们帮助您获得“ValueFromDialogBox”,请尽力告诉我们“ValueFromDialogBox”是什么。它是窗口内容的属性吗?如果您希望我们帮助您查找窗口内容的属性,则必须告诉我们有关窗口内容及其属性的信息。 –

+0

这是一个属性。它是一个列表框中的字符串。 ListBox SelectedItem绑定到ViewModel属性SelectedInstrument。当ViewModel被实例化时,ListBox被填充。 – ScottinTexas

回答

1
//Open a control to prompt for instrument. 
Window window = new Window 
{ 
    Title = "Associate Com Port", 
    Content = new MyDialogView(), 
    SizeToContent = SizeToContent.WidthAndHeight, 
    ResizeMode = ResizeMode.NoResize 
}; 
window.ShowDialog(); 

// The view is the window content. 
var view = (MyDialogView)window.Content; 

// The view XAML created an instance of MyDialogViewModel and assigned it to 
// the view's DataContext. 
MyDialogViewModel dlgVM = (MyDialogViewModel)view.DataContext; 

// Now you've got the viewmodel that was used in the dialog, with all its 
// properties intact. 
MessageBox.Show($"Instrument selected was {dlgVM.InstrumentSelected}"); 

如何关闭该窗口在这种情况下, :

用户控件XAML:

<StackPanel 
    Orientation="Horizontal" 
    > 
    <Button 
     Content="_OK" 
     Click="OKButton_Click" 
     /> 
    <Button 
     Content="_Cancel" 
     IsCancel="True" 
     /> 
</StackPanel> 

用户控件后台代码:

private void OKButton_Click(object sender, RoutedEventArgs e) 
{ 
    Window.GetWindow(sender as DependencyObject).DialogResult = true; 
} 

取消按钮的作品,如果你只是设置IsCancel="True"就可以了。在这种情况下,ShowDialog()将返回false。在明确设置DialogResult的情况下,ShowDialog()将返回您分配给DialogResult的布尔值,除非它是nullDialogResult = null不会关闭窗口。

+0

工作就像一个魅力。谢谢。现在关闭对话框。我用窗户关闭X来穿过它。我现在需要做的是实现一个OK按钮来关闭对话框。但是,我得到了重要的部分感谢你。 – ScottinTexas

+0

@ScottinTexas见更新。 –