不要問為什么,但我必須在代碼的業務邏輯部分創建一個 WPF Listview(原因是我正在處理遺留代碼,這就是原因。)
無論如何,到目前為止一切正常,但是,我想添加一個名為“PermutationItem”的復選框列,其中只有一些專案具有相應的屬性。如果屬性沒有屬性(= 型別錯誤),我想IsEnabled將復選框的標志設定為false自動。這是到目前為止的代碼:
ListView lvPlatformList = new ListView()
{
Name = "MyListView"
};
lvPlatformList.BorderThickness = new Thickness(1);
lvPlatformList.Margin = new Thickness(0, HeightMargin, 25, HeightMargin);
var gridView = new GridView();
DataTemplate dtEnabled = new DataTemplate() { DataType = typeof(CheckBox) };
FrameworkElementFactory cbfEnabled = new FrameworkElementFactory(typeof(CheckBox));
cbfEnabled.SetBinding(CheckBox.IsCheckedProperty, new Binding("IsEnabled"));
dtEnabled.VisualTree = cbfEnabled;
gridView.Columns.Add(new GridViewColumn()
{
Header = "Enabled",
CellTemplate = dtEnabled
});
gridView.Columns.Add(new GridViewColumn()
{
Header = "Equipment Name",
DisplayMemberBinding = new Binding("Equipment.Name")
{
FallbackValue = "Empty Platform"
},
});
DataTemplate dtPermutationItem = new DataTemplate() { DataType = typeof(CheckBox) };
FrameworkElementFactory cbfPermutationItem = new FrameworkElementFactory(typeof(CheckBox));
cbfPermutationItem.SetBinding(CheckBox.IsCheckedProperty, new Binding("Equipment.IsPermutationItem.Value")
{
FallbackValue = false
});
cbfPermutationItem.SetBinding(CheckBox.IsEnabledProperty, /* What comes here?? */);
dtPermutationItem.VisualTree = cbfPermutationItem;
gridView.Columns.Add(new GridViewColumn()
{
Header = "PermutationItem",
CellTemplate = dtPermutationItem
});
lvPlatformList.View = gridView;
我知道如何在 XAML 中解決這個問題,但是如何在代碼中完成?
uj5u.com熱心網友回復:
我能夠使用帶有新IValueConverter類的單獨 Binding 來解決它。而不是IsEnabled我使用了Visibility屬性,但相同的程序適用于任何屬性。
這是新的系結:
cbfPermutationItem.SetBinding(CheckBox.VisibilityProperty, new Binding("Equipment")
{
Converter = new DataTypeToVisibilityConverter(),
ConverterParameter = typeof(MyTargetClass)
});
這是相應的可見性轉換器:
public class DataTypeToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null)
return Visibility.Hidden;
Type compareType = parameter as Type;
Type valueType = value.GetType();
if (compareType.IsAssignableFrom(valueType))
{
return Visibility.Visible;
}
else
{
return Visibility.Hidden;
}
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
顯然,您可以將任何您想要的內容放入轉換器中,但是這里IsAssignableFrom()需要注意的是,在我的情況下需要使用該函式來處理繼承型別。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/363183.html
