2017-04-08 65 views
-1

现在我已经在这个问题的最佳方法上打破了我的头脑,并且我需要为我清除一些疑惑,因为有很多地方我不确定什么是正确的绑定方法。我正在为autocad(使用它的api)的一个小应用程序,并加快调试,我用CMD模拟它;如何在代码隐藏的实例中对XAML中的数据绑定

该应用程序创建我的模型的一个实例,并且该模型实例化my_window。

在模型中,我有ObservableCollection“window_display_data”这应该填充WPF中的数据网格。我知道我可以使用codebehind,来设置datacontext,但我也知道,要使用“属性面板预览”,最好从“标记代码”设置datacontext,这就是我所知道的试图去做。

我能够“意外”填充表格,但在那种情况下,我将我的可观察集合设置为“静态”,我没有在任何地方看到推荐...所以请有人给我一个审查代码和什么是绑定我的网格的首选路径。

我 “ACAD模拟器”

public static void Main() 
{ 
    MyCommands start = new MyCommands(); 
    start.model(); 
} 

public partial class MyCommands 
{ 
    public ObservableCollection<string> window_display_data { get; set; }   

    public void model() 
    { 
     .....test values initialization... 

     MainWindow _window = new MainWindow(this); 
     var application = new System.Windows.Application(); 
     application.Run(_window); 
    } 
} 

public partial class MainWindow : Window 
{ 
    public static MyCommands myModel { get; set; } 

    public MainWindow(MyCommands model) 
    { 

     myModel = new MyCommands(); 
     myModel= model; 
     InitializeComponent(); 
     //this.DataContext = myModel; 
    } 
} 

我的 “窗口”

<Window 
    x:Name="MainWindowName" 
    x:Class="_2017_test_binding.MainWindow"  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    xmlns:local="local" 
    xmlns:local1="clr-namespace:_2017_test_binding"  
    xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    Title="MainWindow" Height="220" Width="200" WindowStartupLocation="CenterOwner" 
    ResizeMode="CanResizeWithGrip" MouseDown="Window_MouseDown" Topmost="True"  
    DataContext="{Binding RelativeSource={RelativeSource Self}}"> 
<Grid> 
    <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Width="192" 
       GridLinesVisibility="Horizontal" AutoGenerateColumns="False" 
       ItemsSource="{Binding ElementName=MainWindowName, Path=myDictionary}"> 

     <DataGrid.Columns > 
      <DataGridTextColumn Header="Command" Binding="{Binding Mode=OneWay, Path=window_display_data}"></DataGridTextColumn> 
     </DataGrid.Columns> 
    </DataGrid> 
</Grid> 

我想我应该设置DataContext的窗口,并让它立明到的数据网格;但没有调试,我永远不知道结果会在那里结束。

另外,有人可以为我澄清,为什么VS中的“属性面板中的dataContext窗口”显示指向“对象”而不是实例的链接?这让我完全困惑,因为如果我的实例正在做所有的工作,那么我对该链接有什么用处。

enter image description here

+0

ty [John Strit](http://stackoverflow.com/users/5737039/john-strit)提供编辑建议。 –

回答

1

它知道XAML和MVVM设计模式经验的开发人员几乎从来不使用属性面板在Visual Studio设置属性,我会说。就我个人而言,我几乎从不使用设计师。如果你对WPF很认真,你应该真正学习XAML。

您可以在XAML和代码中设置属性。在这种情况下,你与你的MyCommands类的一个实例注入MainWindow,你可以设置窗口的DataContextMyCommands对象,然后直接绑定到ObservableCollection<string>

public partial class MainWindow : Window 
{ 
    private readonly MyCommands _myModel; 

    public MainWindow(MyCommands model) 
    { 
     _myModel = model; 
     InitializeComponent(); 
     this.DataContext = _myModel; 
    } 
} 

<Window 
    x:Name="MainWindowName" 
    x:Class="_2017_test_binding.MainWindow"  
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"   
    xmlns:local="local" 
    xmlns:local1="clr-namespace:_2017_test_binding"  
    xmlns:Themes="clr-namespace:Microsoft.Windows.Themes;assembly=PresentationFramework.Aero2" 
    xmlns:System="clr-namespace:System;assembly=mscorlib" 
    Title="MainWindow" Height="220" Width="200" WindowStartupLocation="CenterOwner" 
    ResizeMode="CanResizeWithGrip" MouseDown="Window_MouseDown" Topmost="True"> 
    <Grid> 
     <DataGrid x:Name="dataGrid" HorizontalAlignment="Left" Width="192" 
       GridLinesVisibility="Horizontal" AutoGenerateColumns="False" 
       ItemsSource="{Binding window_display_data}"> 
      <DataGrid.Columns > 
       <DataGridTextColumn Header="Command" Binding="{Binding}"></DataGridTextColumn> 
      </DataGrid.Columns> 
     </DataGrid> 
    </Grid> 
</Window> 

DataGrid从窗口继承DataContextMyCommands)并绑定到window_display_data属性。 DataGridTextColumn然后绑定到ItemsSource中的字符串。

+0

感谢您的回复。我知道,对于专业人士来说,“约束性问题”一定是令人讨厌的(看到这方面有一堆线索);它只是大多数采取不同的方法,这增加了对新手的混淆。 我知道我可以使用this.DataContext = _model;但我评论说,因为我读过这种方法可能无法正常工作或在设计时显示预览。但我认为你是对的;我会坚持使用绑定的代码方法,直到我对自己更有信心直接用XML来完成; –

+0

要获得设计时支持,您可以按照以下建议设置窗口的d:DataContext属性:http://stackoverflow.com/questions/1889966/what-approaches-are-available-to-dummy-design-time-data -in-WPF。尽管如此,我会花费大量时间讨论设计时间问题。当然,Visual Studio中的设计师无法处理这些情况,并且您无法对此做任何事情。 – mm8

+0

谢谢。我知道属性,但我认为它不会工作,如果dataContext在代码隐藏中实现。那就是为什么我强迫自己在xaml中完成整个工作;因此,我迫使自己在xaml中完成绑定。 –

相关问题