C# 正在尝试将行放入具有转换的ItemsControl中

C# 正在尝试将行放入具有转换的ItemsControl中,c#,wpf,line,itemscontrol,C#,Wpf,Line,Itemscontrol,对于我的项目,我要画一些线,我需要检查它们是否在可见的X和Y中-所以我想我应该使用一个多值转换器,如果它在X,Y中,它将返回该线,否则返回null或其他。我想知道如何将行的X1、X2等绑定到返回的行对象?在下面的XAML中,您可以看到我试图通过带有visible min max等的Lines observable集合,我想看看最后一行是否在边界内。如果是这样的话,返回它(目前所有的返回都是为了测试目的),我想用返回的行绑定该行。不知道该怎么做 整个项目的目标是最终绘制一辆小型机器人汽车的行驶路线

对于我的项目,我要画一些线,我需要检查它们是否在可见的X和Y中-所以我想我应该使用一个多值转换器,如果它在X,Y中,它将返回该线,否则返回null或其他。我想知道如何将行的X1、X2等绑定到返回的行对象?在下面的XAML中,您可以看到我试图通过带有visible min max等的Lines observable集合,我想看看最后一行是否在边界内。如果是这样的话,返回它(目前所有的返回都是为了测试目的),我想用返回的行绑定该行。不知道该怎么做

整个项目的目标是最终绘制一辆小型机器人汽车的行驶路线——使用这些路线。最后,我想要一些缩放功能,所以我尝试通过绑定创建线条

我的XAML项控件看起来像

    <ItemsControl x:Name="Items">
    <ItemsControl.ItemsSource>
        <MultiBinding Converter="{StaticResource conv}">
            <Binding Path="Lines"/>
            <Binding Path="VisibleMinX"/>
            <Binding Path="VisibleMinY"/>
            <Binding Path="VisibleMaxX"/>
            <Binding Path="VisibleMaxY"/>

        </MultiBinding>
    </ItemsControl.ItemsSource>
        <ItemsControl.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas/>
            </ItemsPanelTemplate>
        </ItemsControl.ItemsPanel>
    <ItemsControl.ItemTemplate>
        <DataTemplate>
            <Line X1="{Binding X1}" X2="{Binding X2}" Y1="{Binding Y1}" Y2="{Binding Y2}" Stroke="Black" StrokeThickness="2"/>
        </DataTemplate>
    </ItemsControl.ItemTemplate>
    </ItemsControl>

我的视图模型(main的代码隐藏为空)

class VM:INotifyPropertyChanged
{
公共AddLineCommand AddLineCommand{get;set;}
公共虚拟机()
{
VisibleMinX=0;
可视性=0;
VisibleMaxX=300;
VisibleMaxY=300;
//试验
CreateLine(100100150150);
CreateLine(150150200280);
addlinecommand=新的addlinecommand(此命令);
}
私有ObservableCollection行=新ObservableCollection();
公共可观测收集线
{
得到
{
回流线;
}
}
公共void创建线(int-x1、int-y1、int-x2、int-y2)
{
行=新行();
line.X1=X1;
第1.Y1行=Y1;
line.X2=X2;
line.Y2=Y2;
line.StrokeThickness=2;
SolidColorBrush black=新的SolidColorBrush();
黑色。颜色=颜色。黑色;
线条笔划=黑色;
行。添加(行);
不动产变更(“行”);
}
公共void AddLine()
{
CreateLine(0,0,100,100);
}
私有int_VisibleMinX;
公共int VisibleMinX
{
获取{return\u VisibleMinX;}
设置{u VisibleMinX=value;}
}
私有int_VisibleMaxX;
公共int VisibleMaxX
{
获取{return\u VisibleMaxX;}
设置{u VisibleMaxX=value;}
}
私人内部可视性;
公共int可视性
{
获取{return\u VisibleMinY;}
设置{u VisibleMinY=value;}
}
私用int_VisibleMaxY;
公共int可视性AXY
{
获取{return\u VisibleMaxY;}
设置{u VisibleMaxY=value;}
}
#区域inotifyproperty已更改
公共事件属性更改事件处理程序属性更改;
私有void OnPropertyChanged(字符串propertyName)
{
if(PropertyChanged!=null)
{
PropertyChanged(这是新的PropertyChangedEventArgs(propertyName));
}
}
#端区
}
}

还有我的转换器

class conv : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        ObservableCollection<Line> line = (ObservableCollection<Line>)values[0];
        int MinX = (int)values[1];
        int MinY = (int)values[2];
        int MaxX = (int)values[3];
        int MaxY = (int)values[4];

        return line[line.Count-1];  //returning last line obj
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}
class conv:IMultiValueConverter
{
公共对象转换(对象[]值,类型targetType,对象参数,CultureInfo区域性)
{
ObservableCollection行=(ObservableCollection)值[0];
int MinX=(int)值[1];
int MinY=(int)值[2];
int MaxX=(int)值[3];
int MaxY=(int)值[4];
返回行[line.Count-1];//返回最后一行obj
}
公共对象[]转换回(对象值,类型[]目标类型,对象参数,CultureInfo区域性)
{
抛出新的NotImplementedException();
}
}

首先,正如安库姆斯坎所说,你所做的没有多大意义。其次,我只是想表达我的观点,如果应用程序逻辑本身涉及到绘图相关的东西,那么您可以在ViewModel本身中简单地执行逻辑。(我知道这里会有人不同意我)

因此,我的意思是-如果基于一些有效的
VisibleMinX
等过滤/修改
集合是业务逻辑的一部分,那么在ViewModel中正确地进行操作


不幸的是,目前还不清楚您的目标是什么,所以我无法发布一些示例代码。如果您碰巧更新了您的问题,我可能会发布更新。

问题不清楚。您的转换器返回一行,因此您的
ItemsSource
现在由一行组成(单个对象而不是集合)。您试图在IC中显示什么?@AnjumSKhan Umm是的,它应该是一个单行对象。在转换器中,我最终会对数字进行一些编辑或处理——现在让它真正工作起来真的很简单。它返回的那一行,我想用该行的x1,x2,y1,y2值绑定items控件中im创建的新行。如果这有意义的话?我仍然不知道你想做什么,但这应该可以解决你的问题:用
return
替换为
returnnewobserveCollection(){line[line.Count-1]}@AnjumSKhan解决了手头的问题是的,但是-它用新行值替换了旧行,这很有意义,因为我现在意识到我的逻辑是错误的。我希望能够将线条添加到可观察集合中,当我添加该线条时,它就会被绘制出来。之所以会出现可见的x和y元素,是因为我们最终想要一个放大和缩小类型的东西。我最初认为items源中的条目每次都会创建一条新线,但我错了,并给出了从这里开始的提示?最终我的目标是创建一个程序,该程序将使用线绘制一辆小型机器人汽车的路径。由于用户可能会向右说很远的距离,因此我们需要在稍后放大我们的功能
class conv : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        ObservableCollection<Line> line = (ObservableCollection<Line>)values[0];
        int MinX = (int)values[1];
        int MinY = (int)values[2];
        int MaxX = (int)values[3];
        int MaxY = (int)values[4];

        return line[line.Count-1];  //returning last line obj
    }

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}