WPF绑定到xaml中的多维数组
我很难制定XAML字符串以链接到多维数组中的特定元素 DataContext包含以下行:WPF绑定到xaml中的多维数组,wpf,data-binding,binding,Wpf,Data Binding,Binding,我很难制定XAML字符串以链接到多维数组中的特定元素 DataContext包含以下行: private String[] _OneDimension = { "[0]", "[1]" }; private String[][] _Jagged = { new String[] { "[0,0]", "[0,1]" }, new String[] { "[1,0]", "[1,1]" } }; private String[,] _TwoDimension = { { "
private String[] _OneDimension = { "[0]", "[1]" };
private String[][] _Jagged = { new String[] { "[0,0]", "[0,1]" }, new String[] { "[1,0]", "[1,1]" } };
private String[,] _TwoDimension = { { "[0,0]", "[0,1]" }, { "[1,0]", "[1,1]" } };
public String[] OneDimension { get { return _OneDimension; } }
public String[][] Jagged { get { return _Jagged; } }
public String[,] TwoDimension { get { return _TwoDimension; } }
<StackPanel>
<Button Content="{Binding OneDimension[1]}" Width="100" Height="50" />
<Button Content="{Binding Jagged[1][1]}" Width="100" Height="50" />
<Button Content="{Binding TwoDimension[1][1]}" Width="100" Height="50" />
</StackPanel>
XAML包含以下行:
private String[] _OneDimension = { "[0]", "[1]" };
private String[][] _Jagged = { new String[] { "[0,0]", "[0,1]" }, new String[] { "[1,0]", "[1,1]" } };
private String[,] _TwoDimension = { { "[0,0]", "[0,1]" }, { "[1,0]", "[1,1]" } };
public String[] OneDimension { get { return _OneDimension; } }
public String[][] Jagged { get { return _Jagged; } }
public String[,] TwoDimension { get { return _TwoDimension; } }
<StackPanel>
<Button Content="{Binding OneDimension[1]}" Width="100" Height="50" />
<Button Content="{Binding Jagged[1][1]}" Width="100" Height="50" />
<Button Content="{Binding TwoDimension[1][1]}" Width="100" Height="50" />
</StackPanel>
未编译,因为XAML被解释为具有绑定构造函数的两个参数。是否有某种方法可以逃避解析器,或者是否有另一种我不知道的编写方法
编辑: 我刚刚发现像这样逃离分离器是可能的
<Button Content="{Binding TwoDimension[1\,1]}" Width="100" Height="50" />
<Button Content="{Binding 'TwoDimension[1,1]'}" Width="100" Height="50" />
或者用这样的标记围绕论点
<Button Content="{Binding TwoDimension[1\,1]}" Width="100" Height="50" />
<Button Content="{Binding 'TwoDimension[1,1]'}" Width="100" Height="50" />
然而,这一行现在导致了一个异常:System.ArgumentException
{“Das Array war kein eindindimensionals Array.”不幸的是,C#用我的母语安装了它自己-像屎一样烦人。。。这大致可以翻译为{“数组不是一维数组。”}
实际上不可能绑定多维数组吗?默认情况下,WPF XAML不允许像这样绑定到二维数组。只有一维阵列。然而,没有什么是不可能的。只是很费时。您必须创建一个自定义类来完成此操作,并将其用作绑定方式
/// <summary>
/// This class is a bindable encapsulation of a 2D array.
/// </summary>
/// <typeparam name="T"></typeparam>
public class BindableTwoDArray<T> : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private void Notify(string property)
{
var pc = PropertyChanged;
if (pc != null)
pc(this, new PropertyChangedEventArgs(property));
}
T[,] data;
public T this[int c1, int c2]
{
get { return data[c1, c2]; }
set
{
data[c1, c2] = value;
Notify(Binding.IndexerName);
}
}
public string GetStringIndex(int c1, int c2)
{
return c1.ToString() + "-" + c2.ToString();
}
private void SplitIndex(string index, out int c1, out int c2)
{
var parts = index.Split('-');
if (parts.Length != 2)
throw new ArgumentException("The provided index is not valid");
c1 = int.Parse(parts[0]);
c2 = int.Parse(parts[1]);
}
public T this[string index]
{
get
{
int c1, c2;
SplitIndex(index, out c1, out c2);
return data[c1, c2];
}
set
{
int c1, c2;
SplitIndex(index, out c1, out c2);
data[c1, c2] = value;
Notify(Binding.IndexerName);
}
}
public BindableTwoDArray(int size1, int size2)
{
data = new T[size1, size2];
}
public static implicit operator T[,](BindableTwoDArray<T> a)
{
return a.data;
}
}
//
///此类是2D数组的可绑定封装。
///
///
公共类BindableTowDarray:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私有void Notify(字符串属性)
{
var pc=已更改的财产;
如果(pc!=null)
pc(本,新财产变更发展权(财产));
}
T[,]数据;
公共T此[int c1,int c2]
{
获取{返回数据[c1,c2];}
设置
{
数据[c1,c2]=数值;
通知(Binding.IndexerName);
}
}
公共字符串GetStringIndex(int c1,int c2)
{
返回c1.ToString()+“-”+c2.ToString();
}
私有void SplitIndex(字符串索引,out int c1,out int c2)
{
变量部分=指数分割('-');
如果(parts.Length!=2)
抛出新ArgumentException(“提供的索引无效”);
c1=int.Parse(部分[0]);
c2=int.Parse(第[1]部分);
}
此[字符串索引]
{
得到
{
int c1,c2;
拆分索引(索引,c1外,c2外);
返回数据[c1,c2];
}
设置
{
int c1,c2;
拆分索引(索引,c1外,c2外);
数据[c1,c2]=数值;
通知(Binding.IndexerName);
}
}
公共BindableTowDarray(整数大小1,整数大小2)
{
数据=新T[size1,size2];
}
公共静态隐式运算符T[,](BindableTowDarray a)
{
返回a.data;
}
}
然后可以绑定到XAML:
<TextBlock Text="{Binding MyBindableTwoDArray[2-5]}"/>
解决方案
这可能会影响性能,这让我开始质疑如何使用多维数组?您可以使用列表,这可能更容易实现。看看。您可以使用定义如下的多值转换器绑定到二维数组:
class MultiDimensionalCoverter:IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return (values[0] as String[,])[(int) values[1], (int) values[2]];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
<Window.Resources>
<wpfApp:MultiDimensionalCoverter x:Key="MultiDimensionalCoverter"/>
</Window.Resources>
<Grid>
<StackPanel>
<Button Content="{Binding OneDimension[1]}" Width="100" Height="50" />
<Button Content="{Binding Jagged[1][1]}" Width="100" Height="50" />
<Button Width="100" Height="50" >
<Button.Resources>
<system:Int32 x:Key="1">1</system:Int32>
</Button.Resources>
<Button.Content>
<MultiBinding Converter="{StaticResource MultiDimensionalCoverter}">
<Binding Path="TwoDimension"/>
<Binding Source="{StaticResource 1}"/>
<Binding Source="{StaticResource 1}"/>
</MultiBinding>
</Button.Content>
</Button>
</StackPanel>
</Grid>
多维转换器得到3个参数,二维数组加上两个索引,Xaml如下:
class MultiDimensionalCoverter:IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
return (values[0] as String[,])[(int) values[1], (int) values[2]];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
<Window.Resources>
<wpfApp:MultiDimensionalCoverter x:Key="MultiDimensionalCoverter"/>
</Window.Resources>
<Grid>
<StackPanel>
<Button Content="{Binding OneDimension[1]}" Width="100" Height="50" />
<Button Content="{Binding Jagged[1][1]}" Width="100" Height="50" />
<Button Width="100" Height="50" >
<Button.Resources>
<system:Int32 x:Key="1">1</system:Int32>
</Button.Resources>
<Button.Content>
<MultiBinding Converter="{StaticResource MultiDimensionalCoverter}">
<Binding Path="TwoDimension"/>
<Binding Source="{StaticResource 1}"/>
<Binding Source="{StaticResource 1}"/>
</MultiBinding>
</Button.Content>
</Button>
</StackPanel>
</Grid>
1.
将索引定义为VM中的属性可能更合适,我使用固定值只是为了演示 据我所知,在纯
Xaml
中绑定多维数组是不可能的,你必须创建一个IValueConverter
来完成这项工作。。。那将是数组。。。但是有一个数组的ValueConverter-我确信这一点。我可以注入我的onw吗?试试这个链接。希望能有帮助