Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF绑定/依赖属性(列表)_C#_Wpf_Mvvm_Binding_Dependencies - Fatal编程技术网

C# WPF绑定/依赖属性(列表)

C# WPF绑定/依赖属性(列表),c#,wpf,mvvm,binding,dependencies,C#,Wpf,Mvvm,Binding,Dependencies,我有一个应用程序,可以显示2个图像列表框。它们是相同的图像,但顺序不同。比较每个顺序中的位置是相关的,因此我为每个列表框使用单独的列表 该列表具有多个依赖属性,这样我就可以显示多个属性以及图像本身 简单地说,我填充了2个列表实例。ImageCrawler类中的属性都是依赖项属性 我对MVVM的理解还不够透彻,所以如果它不好的话,请原谅——我使用了另一个类-ViewModel,它包含两个列表,还有dep.属性,如下所示: public class ViewModel : DependencyObj

我有一个应用程序,可以显示2个图像列表框。它们是相同的图像,但顺序不同。比较每个顺序中的位置是相关的,因此我为每个列表框使用单独的列表

该列表具有多个依赖属性,这样我就可以显示多个属性以及图像本身

简单地说,我填充了2个列表实例。ImageCrawler类中的属性都是依赖项属性

我对MVVM的理解还不够透彻,所以如果它不好的话,请原谅——我使用了另一个类-ViewModel,它包含两个列表,还有dep.属性,如下所示:

public class ViewModel : DependencyObject
{

    public List<ImageCrawler> Box1
    {
        get { return (List<ImageCrawler>)GetValue(ImageProperty); }
        set { SetValue(ImageProperty, value); }
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty ImageProperty =
        DependencyProperty.Register("Box1", typeof(List<ImageCrawler>), typeof(ViewModel));





    public List<ImageCrawler> Box2
    {
        get { return (List<ImageCrawler>)GetValue(Image2Property); }
        set { SetValue(Image2Property, value); }
    }

    // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty Image2Property =
        DependencyProperty.Register("Box2", typeof(List<ImageCrawler>), typeof(ViewModel));

}
…据我所知,它指的是App.xaml中的实例

单击一个按钮,逻辑将获取ImageCrawler对象的列表,将它们放入列表中,然后将列表分配给上面定义的视图变量…但绑定不起作用:(…其他所有操作都起作用…因此我这样做是为了将刚获取的列表分配给视图:

view.Box1 = Box1;
…其中Box1是列表变量。。。 编辑:我仍然对这一部分感到困惑…不知道这是否是一个问题。我仍然在从XAML实例创建这个“视图”变量…并将列表分配给它…我觉得我需要设置ViewModel的XAML实例的属性…而不是将其设置为变量并设置它…但不知道如何…或如何工作:/

如果我这样做:

ImageBox1.ItemsSource = view.Box1;

…然后它就完美地工作了(减去让我发疯的内存泄漏,但这是另一个故事:)…但我似乎不明白为什么在XAML中设置ItemsSource不起作用。

您根本不应该设置ListBox的DataContext。与其将ViewModel创建为资源,不如直接将其分配给窗口的DataContext,并让子元素继承DataContent:

<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
...

<!-- ListBox DataContext is inherited from Window -->
<ListBox ItemsSource="{Binding Box1}" ...>

检查“输出”窗口。绑定错误通常会写入其中。显示我的编程新手hehe…以下是错误:System.Windows.Data错误:40:BindingExpression路径错误:“在“对象”“主窗口”(Name='Scope')上找不到Box1”属性。BindingExpression:Path=Box1;DataItem='MainWindow'(Name='Scope');目标元素是'ListBox'(Name='ImageBox1');目标属性是'ItemsSource'(类型'IEnumerable'),但是,我认为这是我试图使用DataContext=this;在主窗口中…我认为这不正确,因为我在XAML中设置了它…尝试删除它…现在我没有看到任何即将出现的内容…这很有趣。它在
main窗口上查找
Box1
属性,而不是您的
ViewModel
——这意味着
ListBox
DataContext
main窗口
而不是
ViewModel
。您上面粘贴的示例代码不是实际代码的样子,或者您正在其他地方设置
DataContext
属性。是的,请参见我最后一条评论的结尾。我以前一直在玩弄它,试图在主窗口中设置它,但忘了删除它。在没有该选项的情况下再次尝试,并且在我删除它后,在输出中没有看到任何有帮助的内容。不过谢谢你的想法,现在我知道要看那里:)改变顺序没有任何作用。我尝试按照建议定义DataContext(并删除了StaticResource)。我只剩下访问ViewModel实例的方式了。当我尝试像您一样定义它时,我在“DataContext”部分收到了一个语法投诉-字段初始值设定项不能引用非静态字段…等等。。。不管怎样,不幸的是我没有看到行为上的改变。谢谢:)。请参阅我的编辑。初始化MainWindow类成员时不应该访问DataContext。啊,感谢您的澄清。好的,我试过了,但结果还是一样。如果我在codebehind中手动设置ItemsSource,效果很好,但是来自XAML的绑定不起作用。。。看起来我仍然在将信息放入从app.xaml实例创建的viewModel变量中,而不是修改app.xaml实例本身……但我不确定如何修改。
view.Box1 = Box1;
ImageBox1.ItemsSource = view.Box1;
<Window.DataContext>
    <local:ViewModel/>
</Window.DataContext>
...

<!-- ListBox DataContext is inherited from Window -->
<ListBox ItemsSource="{Binding Box1}" ...>
private void someMethodInMainWindow()
{
    var viewModel = (ViewModel)DataContext;
    viewModel.Box1 = ...
}