這是很容易的,真的。
我猜你試圖使用可變大小的網格視圖?實際上,這是一個相當常見的要求。但是,由於各種範圍以及如何呈現,你所要求的是棘手的。
第一個想你需要做的就是用你自己的自定義ListView覆蓋ListView。我們稱之爲MyListView。就像這樣:
public class MyItem
{
public int RowSpan { get; set; }
public int ColSpan { get; set; }
}
public class MyListView : ListView
{
protected override void PrepareContainerForItemOverride(DependencyObject element, object item)
{
var model = item as MyItem;
try
{
element.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, model.ColSpan);
element.SetValue(VariableSizedWrapGrid.RowSpanProperty, model.RowSpan);
}
catch
{
element.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, 1);
element.SetValue(VariableSizedWrapGrid.RowSpanProperty, 1);
}
finally
{
element.SetValue(VerticalContentAlignmentProperty, VerticalAlignment.Stretch);
element.SetValue(HorizontalContentAlignmentProperty, HorizontalAlignment.Stretch);
base.PrepareContainerForItemOverride(element, item);
}
}
}
一切都發生在PrepareContainerForItemOverride
的地方,您需要重寫子類中的唯一方法。請注意,我沒有設置它們的綁定。這是因爲這些屬性僅在渲染項目時才被觀察到。如果您想刷新ListView並根據新值重新渲染項目,則需要在根面板上調用InvalidateMeasure()
,這很棘手。你可以這樣做:
// MyListView
public void Update()
{
if (!(this.ItemsPanelRoot is VariableSizedWrapGrid))
throw new ArgumentException("ItemsPanel is not VariableSizedWrapGrid");
foreach (var container in this.ItemsPanelRoot.Children.Cast<GridViewItem>())
{
var model = item as MyItem;
VariableSizedWrapGrid.SetRowSpan(container, data.RowSpan);
VariableSizedWrapGrid.SetColumnSpan(container, data.ColSpan);
}
this.ItemsPanelRoot.InvalidateMeasure();
}
如果這是有道理的,你可以看到整個實現here。
祝你好運!
我一直只用{結合OBJECTPROPERTY}在DataTemplate中。作爲一種解決方法,您可以簡單地在DataTemplate內部的TextBlock邊框周圍使用相同的Background聲明。 當您運行應用程序時,您是否在輸出窗口中看到任何BindingExpression錯誤?它是否達到了一個斷點? –
@MarkW綁定風格的Setters不能在Windows運行時/ UWP中工作。 [OP知道這一事實](http://stackoverflow.com/q/33052081/1136211)。 – Clemens
@clemens OP意識到問題,沒有人提供解決方案。我創建了一個自定義容器,無法綁定到它。在WPF中這很常見,我認爲有一個解決方案。沒有FindAncestor,也沒有綁定Setter。我無法相信這種正常情況是不可能解決的。 – SuperJMN