如何从 2 ViewModel WPF 绑定数据
How to bind data from 2 ViewModel WPF
正如标题所说,我试图从 2 个不同的 ViewModel 获取数据,但它没有显示任何内容。我做错了吗?
这是我的 XAML
<Window.DataContext>
<local:VMContainer/>
</Window.DataContext>
<Grid>
<StackPanel Orientation="Horizontal">
<ItemsControl ItemsSource="{Binding Path=VM1.LibraryVM1}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Image Width="150" Height="200" Source="{Binding Path=cover}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding Path=VM2.LibraryVM2}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Image Width="150" Height="200" Source="{Binding Path=cover}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
我的容器
public class VMContainer
{
public VModel1 VM1 { get; set; }
public VModel2 VM2 { get; set; }
}
视图模型 1
public class VModel1
{
public DataView LibraryVM1 { get; private set; }
public VModel1()
{
DataTable vm1 = new DataTable();
using (MySqlConnection connection = new MySqlConnection("SERVER=localhost;" + "DATABASE=library;" + "UID=root;" + "PASSWORD=;"))
{
MySqlDataAdapter adapter = new MySqlDataAdapter();
adapter.SelectCommand = new MySqlCommand("Select * from index_movie_list", connection);
adapter.Fill(vm1);
}
LibraryVM1 = vm1.DefaultView;
}
}
ViewModel 2
public class VModel2
{
public DataView LibraryVM2 { get; private set; }
public VModel2()
{
DataTable vm2 = new DataTable();
using (MySqlConnection connection = new MySqlConnection("SERVER=localhost;" + "DATABASE=library;" + "UID=root;" + "PASSWORD=;"))
{
MySqlDataAdapter adapter = new MySqlDataAdapter();
adapter.SelectCommand = new MySqlCommand("Select * from index_tv_list", connection);
adapter.Fill(vm2);
}
LibraryVM2 = vm2.DefaultView;
}
}
当我运行程序时,它只显示空白。当我在没有容器和 select 1 ViewModel 的情况下更改它时,它仅显示图像,但我无法查看我的 ViewModel 2。是否有任何解决方案?
编辑:问题在我初始化 VM1 和 VM2 后解决,感谢 Loocid
回答。
您的 VMContainer
从未初始化 VModel1
和 VModel2
因此您绑定到 null
.
试试这个:
public class VMContainer
{
public VModel1 VM1 { get; set; } = new VModel1();
public VModel2 VM2 { get; set; } = new VModel2();
}
正如标题所说,我试图从 2 个不同的 ViewModel 获取数据,但它没有显示任何内容。我做错了吗?
这是我的 XAML
<Window.DataContext>
<local:VMContainer/>
</Window.DataContext>
<Grid>
<StackPanel Orientation="Horizontal">
<ItemsControl ItemsSource="{Binding Path=VM1.LibraryVM1}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Image Width="150" Height="200" Source="{Binding Path=cover}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
<ItemsControl ItemsSource="{Binding Path=VM2.LibraryVM2}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Image Width="150" Height="200" Source="{Binding Path=cover}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</StackPanel>
</Grid>
我的容器
public class VMContainer
{
public VModel1 VM1 { get; set; }
public VModel2 VM2 { get; set; }
}
视图模型 1
public class VModel1
{
public DataView LibraryVM1 { get; private set; }
public VModel1()
{
DataTable vm1 = new DataTable();
using (MySqlConnection connection = new MySqlConnection("SERVER=localhost;" + "DATABASE=library;" + "UID=root;" + "PASSWORD=;"))
{
MySqlDataAdapter adapter = new MySqlDataAdapter();
adapter.SelectCommand = new MySqlCommand("Select * from index_movie_list", connection);
adapter.Fill(vm1);
}
LibraryVM1 = vm1.DefaultView;
}
}
ViewModel 2
public class VModel2
{
public DataView LibraryVM2 { get; private set; }
public VModel2()
{
DataTable vm2 = new DataTable();
using (MySqlConnection connection = new MySqlConnection("SERVER=localhost;" + "DATABASE=library;" + "UID=root;" + "PASSWORD=;"))
{
MySqlDataAdapter adapter = new MySqlDataAdapter();
adapter.SelectCommand = new MySqlCommand("Select * from index_tv_list", connection);
adapter.Fill(vm2);
}
LibraryVM2 = vm2.DefaultView;
}
}
当我运行程序时,它只显示空白。当我在没有容器和 select 1 ViewModel 的情况下更改它时,它仅显示图像,但我无法查看我的 ViewModel 2。是否有任何解决方案?
编辑:问题在我初始化 VM1 和 VM2 后解决,感谢 Loocid
回答。
您的 VMContainer
从未初始化 VModel1
和 VModel2
因此您绑定到 null
.
试试这个:
public class VMContainer
{
public VModel1 VM1 { get; set; } = new VModel1();
public VModel2 VM2 { get; set; } = new VModel2();
}