我几个星期以来一直在竭尽全力解决这个问题,我需要为我清除一些疑虑,因为有很多地方我不确定什么是正确的绑定方法。
我正在使用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窗口”显示指向“对象”而不是实例的链接?这让我感到困惑,因为如果我的实例正在完成所有工作,那么我从该链接中有什么用处。
答案 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
从窗口继承DataContext
(MyCommands
)并绑定到window_display_data
属性。 DataGridTextColumn
然后绑定到ItemsSource
。