如何在代码隐藏

时间:2017-04-08 11:38:17

标签: c# wpf xaml datagrid

我几个星期以来一直在竭尽全力解决这个问题,我需要为我清除一些疑虑,因为有很多地方我不确定什么是正确的绑定方法。

我正在使用autocad的小应用程序(使用它的api),并加快debuging,我用cmd模拟它;

应用程序创建我的模型的实例,模型实例化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,然后让它变为dataGrid;但是,如果没有调整,我永远不知道最终会发生什么。

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

enter image description here

1 个答案:

答案 0 :(得分:1)

熟悉XAML和MVVM设计模式的有经验的开发人员几乎从未使用Visual Studio中的属性面板来设置我想说的属性。就个人而言,我几乎从不使用设计师。如果你认真对待WPF,你应该学习XAML。

您可以在XAML和代码中设置属性。在这种情况下,您使用MainWindow类的实例注入MyCommands,您可以将窗口的DataContext设置为MyCommands对象,然后直接绑定到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

中的字符串