[英]Binding a control to a data class using WPF/XAML
我試圖將數據類綁定到WPF中的ListView控件,但似乎無法使其正常工作。 我可以在運行時綁定它,並使用以下命令使其工作:
this.DataContext = DataSet;
但是,如果我在WPF / XAML中嘗試以下操作,它將無法正常工作:
DataContext="DiscoveredItemContainer"
我嘗試了各種排列,但是沒有嘗試。 我只能使用運行時版本,因為它可以正常工作,但是讓我感到煩惱的是,我無法使XAML正確綁定控件。 由於數據集本質上是動態的,因此這可能行不通,但這只是一個想法。
我不確定代碼是否會幫助回答這個問題,但是我會發布相關的內容,希望有什么幫助。 我省略了using聲明。
這是表格的XAML
<Window x:Class="Viking.Test.DataBindTest"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:Items="clr-namespace:Viking.Test.Discovery"
xmlns:data="clr-namespace:Viking.Test"
Title="Data Binding Test" Height="300" Width="500"
DataContext="DiscoveredItemContainer">
<DockPanel Name="_DockPanel" Height="Auto" Width="Auto">
<Menu Name="_Menu" DockPanel.Dock="Top" Height="22" Width="Auto" VerticalContentAlignment="Center" VerticalAlignment="Top">
<MenuItem Name="_File" Header="File">
<MenuItem Name="_AddOne" Header="Add One" Click="AddOne_Click" />
</MenuItem>
</Menu>
<ListView Name="listView1" Height="Auto" Width="Auto" ItemsSource="{Binding Path=DiscoveredItems}">
<ListView.View>
<GridView AllowsColumnReorder="True">
<GridViewColumn Header="Field1" DisplayMemberBinding="{Binding Field1}" Width="100" />
</GridView>
</ListView.View>
</ListView>
</DockPanel>
</Window>
這是XAML附帶的部分類
namespace Viking.Test
{
public partial class DataBindTest : Window
{
private DiscoveredItemList DiscoveredItemContainer;
public DataBindTest()
{
InitializeComponent();
DiscoveredItemContainer = new DiscoveredItemList();
// Uncomment the following line to get the databinding to work
// this.DataContext = DiscoveredItemContainer;
}
private void AddOne_Click(object sender, RoutedEventArgs e)
{
DiscoveredItemContainer.AddRandomItem();
}
} // End of Class
} // End of Namespace
The following is the class that contains the dataset
namespace Viking.Test.Discovery
{
public class DiscoveredItem
{
public DiscoveredItem()
{
}
public string Field1 { get; set; }
} // End of Class
} // End of Namespace
最后,該類將公開ObservableCollection變量以將數據綁定到該類
namespace Viking.Test.Discovery
{
class DiscoveredItemList
{
public ObservableCollection<DiscoveredItem> DiscoveredItems { get; set; }
private Random RandomGen;
public DiscoveredItemList()
{
DiscoveredItems = new ObservableCollection<DiscoveredItem>();
RandomGen = new Random();
}
public void AddRandomItem()
{
DiscoveredItem di = new DiscoveredItem();;
di.Field1 = RandomGen.Next(1,10).ToString();
DiscoveredItems.Add(di);
}
} // End of Class
} // End of Namespace
我見過很多關於將控件綁定到窗體上的另一個控件,或者在運行時綁定(這是我能使它正常工作的方式)或綁定到靜態資源的文章。
對於為何無法采用這種方法的任何見解,我們深表感謝。
通過在XAML中設置DataContext,您決定實例化一個新的DiscoveredItemList,而不是綁定到后面的代碼中。 因此,您的隱藏代碼將不會直接引用DiscoveredItemList,但是您始終可以按名稱搜索它。
您需要做的第一件事是刪除:
DataContext="DiscoveredItemContainer"
並替換為:
<Window.Resources>
<Items:DiscoveredItemList x:Key="Context"></Items:DiscoveredItemList>
</Window.Resources>
這將實例化您的xaml現在可以綁定到的新對象。 您的列表視圖應通過以下方式綁定到它:
<ListView Name="listView1" Height="Auto" Width="Auto" DataContext="{StaticResource Context}" ItemsSource="{Binding DiscoveredItems}">
...
</ListView>
您還必須在代碼后刪除所有對DiscoveredItemContainer的引用,並且在要訪問Items:DiscoveredItemList時(例如添加新的隨機項目),請執行以下操作:
private void AddOne_Click(object sender, RoutedEventArgs e)
{
var list = this.Resources["Context"] as DiscoveredItemList;
list.AddRandomItem();
}
如果需要,您也許可以存儲對該項目的本地引用。
這是您復制/粘貼樂趣的完整代碼。 請注意,我已經對此進行了測試,並且“對我有用”:P
namespace Viking.Test
{
public partial class DataBindTest : Window
{
public DataBindTest()
{
InitializeComponent();
}
private void AddOne_Click(object sender, RoutedEventArgs e)
{
var list = this.Resources["Context"] as DiscoveredItemList;
list.AddRandomItem();
}
} // End of Class
} // End of Namespace
//The following is the class that contains the dataset
namespace Viking.Test.Discovery
{
public class DiscoveredItem
{
public DiscoveredItem() { }
public string Field1 { get; set; }
} // End of Class
public class DiscoveredItemList
{
public ObservableCollection<DiscoveredItem> DiscoveredItems { get; set; }
private Random RandomGen;
public DiscoveredItemList()
{
DiscoveredItems = new ObservableCollection<DiscoveredItem>();
RandomGen = new Random();
}
public void AddRandomItem()
{
DiscoveredItem di = new DiscoveredItem(); ;
di.Field1 = RandomGen.Next(1, 10).ToString();
DiscoveredItems.Add(di);
}
} // End of Class
}
XAML:
<Window x:Class="Viking.Test.DataBindTest" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:Items="clr-namespace:Viking.Test.Discovery" xmlns:data="clr-namespace:Viking.Test" Title="Data Binding Test" Height="300" Width="500" >
<Window.Resources>
<Items:DiscoveredItemList x:Key="Context"></Items:DiscoveredItemList>
</Window.Resources>
<DockPanel Name="_DockPanel" Height="Auto" Width="Auto" >
<Menu Name="_Menu" DockPanel.Dock="Top" Height="22" Width="Auto" VerticalContentAlignment="Center" VerticalAlignment="Top">
<MenuItem Name="_File" Header="File">
<MenuItem Name="_AddOne" Header="Add One" Click="AddOne_Click" />
</MenuItem>
</Menu>
<ListView Name="listView1" Height="Auto" Width="Auto" DataContext="{StaticResource Context}" ItemsSource="{Binding DiscoveredItems}">
<ListView.View>
<GridView AllowsColumnReorder="True">
<GridViewColumn Header="Field1" DisplayMemberBinding="{Binding Field1}" Width="100" />
</GridView>
</ListView.View>
</ListView>
</DockPanel>
</Window>
你應該更換
DataContext="DiscoveredItemContainer"
通過
DataContext="{Binding DiscoveredItemContainer}"
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.